有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在使用retainAll方法后如何重置哈希集?

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

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

设定值如下所示:

HashSet<String> Mexico = new HashSet<String>();

[Olivia、Zoe、Jennifer、Susan、John、Isabella、William、Jack、Emma、Sophia]

HashSet<String> Cuba = new HashSet<String>();

[Olivia、Tom、Jennifer、Susan、John、William、Jack、Emma、Ava、Sophia、Lily]

HashSet<String> Jamaica = new HashSet<String>();

[奥利维亚、汤姆、约翰、威廉、艾娃、杰西卡、莉莉]

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());
        }
    }
}

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


共 (1) 个答案

  1. # 1 楼答案

    Mexico.retainAll变异Mexico{},因此不能调用allThreeCountries后跟onlyMexicoCuba,并期望onlyMexicoCuba将看到Mexico集的原始内容

    您应该生成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());
        }
    }