Как сбросить HashSet после использования метода retainAll на нем? - PullRequest
0 голосов
/ 29 января 2019

У меня есть три HashSets с разными людьми, которые посетили разные страны.Если я использую Mexico.retainAll (Куба);Затем Mexico.retainAll (Ямайка). Здесь приведен список всех людей, которые посетили все три страны.Которые являются: Оливия, Джон, Уильям

Но тогда, когда я делаю Мексику.retainAll (Куба);затем Mexico.removeAll (Ямайка), чтобы получить только людей, которые посетили Мексику и Кубу, но не Ямайку.Это дает мне пустой набор?

Установлены следующие значения:

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

[Оливия, Зоя, Дженнифер, Сьюзан, Джон, Изабелла, Уильям, Джек, Эмма, София]

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

[Оливия, Том, Дженнифер, Сьюзан, Джон, Уильям, Джек, Эмма, Ава, София, Лили]

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

Выход должен был быть [Дженнифер, Сьюзан, Джек, Эмма, София], но я получаю пустой набор.

1 Ответ

0 голосов
/ 29 января 2019

Mexico.retainAll мутирует Mexico Set, поэтому вы не можете вызвать allThreeCountries с последующим onlyMexicoCuba и ожидать, что onlyMexicoCuba увидит исходное содержимое набора Mexico.

Вы должны сгенерировать копию Mexico Set и изменить ее.

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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...