Java 如何在使用retainAll方法后重置HashSet?

Java 如何在使用retainAll方法后重置HashSet?,java,hashset,Java,Hashset,我有三个hashset,有不同的人访问过不同的国家。如果我使用墨西哥。Retainal(古巴);然后是墨西哥。Retainal(牙买加)它给了我所有访问过这三个国家的人的名单。它们是: 奥利维亚,约翰,威廉 但是当我去墨西哥的时候;然后是墨西哥。removeAll(牙买加),只接收访问过墨西哥和古巴但没有访问过牙买加的人。它给了我一套空的 设定值如下所示: HashSet<String> Mexico = new HashSet<String>(); HashSet M

我有三个hashset,有不同的人访问过不同的国家。如果我使用墨西哥。Retainal(古巴);然后是墨西哥。Retainal(牙买加)它给了我所有访问过这三个国家的人的名单。它们是: 奥利维亚,约翰,威廉

但是当我去墨西哥的时候;然后是墨西哥。removeAll(牙买加),只接收访问过墨西哥和古巴但没有访问过牙买加的人。它给了我一套空的

设定值如下所示:

HashSet<String> Mexico = new HashSet<String>();
HashSet Mexico=newhashset();
[奥利维亚、佐伊、詹妮弗、苏珊、约翰、伊莎贝拉、威廉、杰克、艾玛、索菲亚]

HashSet<String> Cuba = new HashSet<String>();
HashSet Cuba=新HashSet();
[奥利维亚、汤姆、詹妮弗、苏珊、约翰、威廉、杰克、艾玛、艾娃、索菲亚、莉莉]

HashSet<String> Jamaica = new HashSet<String>();
HashSet=newhashset();
[奥利维亚、汤姆、约翰、威廉、艾娃、杰西卡、莉莉]

public static void main(String[] args) throws FileNotFoundException {   
    visitorPatternNOOP.allThreeCountries();
    visitorPatternNOOP.onlyMexicoCuba();
}


public class VisitorPatternNOOP {
    public void allThreeCountries (){
        Mexico.retainAll(Cuba);
        Mexico.retainAll(Jamaica);
        Iterator<String>  iterator = Mexico.iterator();
        System.out.println("These people has visited all three countries:  ");
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

    public  void onlyMexicoCuba (){
        Mexico.retainAll(Cuba);
        Mexico.removeAll(Jamaica);
        Iterator<String> iterator = Mexico.iterator();
        System.out.println("These people have visited Mexico and Cuba Only: ");
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
publicstaticvoidmain(字符串[]args)抛出FileNotFoundException{
Visitor Pattern Noop.所有三个国家();
访问者模式noop.onlyMexicoCuba();
}
公共类访问者模式noop{
所有三个国家/地区的公共空间(){
墨西哥:Retainal(古巴);
墨西哥:Retainal(牙买加);
迭代器迭代器=Mexico.Iterator();
这些人访问了所有三个国家:“;
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
仅适用于墨西哥库巴的公共空间(){
墨西哥:Retainal(古巴);
墨西哥:removeAll(牙买加);
迭代器迭代器=Mexico.Iterator();
println(“这些人只访问过墨西哥和古巴:”);
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}

输出应该是[Jennifer,Susan,Jack,Emma,Sophia],但我得到的是空集。

Mexico.Retainal
变异了
Mexico
,所以你不能调用
所有三个国家,然后是
onlyMexicoCuba
,并且希望
只有墨西哥队
才能看到
墨西哥队
集合的原始内容

您应该生成
Mexico
集合的副本,并对该副本进行变异

public void allThreeCountries (){
    HashSet<String> result = new HashSet<>(Mexico);
    result.retainAll(Cuba);
    result.retainAll(Jamaica);
    Iterator<String> iterator = result.iterator();
    System.out.println("These people has visited all three countries:  ");
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

public  void onlyMexicoCuba (){
    HashSet<String> result = new HashSet<>(Mexico);
    result.retainAll(Cuba);
    result.removeAll(Jamaica);
    Iterator<String> iterator = result.iterator();
    System.out.println("These people have visited Mexico and Cuba Only: ");
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}
public void所有三个国家(){
HashSet结果=新的HashSet(墨西哥);
结果:Retainal(古巴);
结果:Retainal(牙买加);
迭代器迭代器=result.Iterator();
这些人访问了所有三个国家:“;
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
仅适用于墨西哥库巴的公共空间(){
HashSet结果=新的HashSet(墨西哥);
结果:Retainal(古巴);
结果:removeAll(牙买加);
迭代器迭代器=result.Iterator();
println(“这些人只访问过墨西哥和古巴:”);
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}

您的方法共享同一组。您需要在两者之间重置它,或者将其保留在方法的本地。是的,
retainal
removeAll
修改您调用它们的集合。如果不希望修改原始集,则需要创建一个副本,并对其进行处理。
HashSet(collection)没有神奇的重置按钮。你只需要重新填充它。开始做什么都行。谢谢,我现在明白了