iterator().next()

144
06 декабря 2019, 16:00

Задача: 1) создать множество cats; 2) в методе createCats() создать 3 кота и присвоить их множеству cats; 3) удалить одного кота из множества cats в методе main; 4) вывести остальных котов на экран методом printCats.

Я долго не мог удалить кота в методе main. Как я только не писал (cats.remove(barsic); cats.remove(1); cats.remove(next()); пытался создать итератор и через него удалить, но тоже как-то накосячил и ничего путнего не вышло) и вдруг мне подсказали написать

cats.remove(cats.iterator().next());

Всё заработало, но я абсолютно не понял КАК это всё заработало. Итератор не создавали да и сама конструкция подозрительная =)

Уважаемые знатоки, объясните что и как тут происходит или дайте, пожалуйста, ссылочку на ресурс

public class Solution {
    public static void main(String[] args) {
        Set<Cat> cats = createCats();
        //напишите тут ваш код. step 3 - пункт 3
        cats.remove(cats.iterator().next());
        printCats(cats);
    }
    public static Set<Cat> createCats() {
        //напишите тут ваш код. step 2 - пункт 2
        Set<Cat> cat = new HashSet<>();
        Cat barsik = new Cat();
        Cat tima = new Cat();
        Cat murzik = new Cat();
        cat.add(barsik);
        cat.add(tima);
        cat.add(murzik);
        return cat;
    }
    public static void printCats(Set<Cat> cats) {
        // step 4 - пункт 4
        for (Cat c: cats) {
            System.out.println(c);
        }
    }
    // step 1 - пункт 1
    public static class Cat{
    }
}
Answer 1

Удалить через cats.remove(barsic) нельзя, потому что barsic - это название переменной, которая была объявлена в другом методе, а это другой неймспейс. Через cats.remove(1) нельзя удалить, потому что нужно передавать объект, а не примитив, а индексов у HashSet нет, так как он работает по принципам хэширования и не может быть упорядоченным и индексы тут не применимы. А вариант cats.remove(cats.iterator().next()) сработал потому что в методе ты берешь итератор сэта, вызываешь у этого итератора метод next(), и этот метод возвращает тебе объект, который находится в этом сэте и уже его ты удаляешь.

READ ALSO
Как запустить Youtube трансляцию и вести ее?

Как запустить Youtube трансляцию и вести ее?

столкнулся с задачейМне нужен создать трансляцию и вести её через Java

153
Решение примеров в веб приложении [закрыт]

Решение примеров в веб приложении [закрыт]

Want to improve this question? Update the question so it focuses on one problem only by editing this post

107
Ошибка слияния манифеста

Ошибка слияния манифеста

После добавления в gradle:

131