powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / HashSet. Удалить объект-класс из HashSet
32 сообщений из 32, показаны все 2 страниц
HashSet. Удалить объект-класс из HashSet
    #39500649
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Есть код:

HashSet<Human> humanHashSet = new HashSet();

humanHashSet.add(new Human("Bull"));
humanHashSet.add(new Human("Bull"));
humanHashSet.add(new Human("Smith"));
humanHashSet.add(new Human("Will"));

Iterator<Human> myIterHuman = humanHashSet.iterator();
while(myIterHuman.hasNext()) {
Human obj_Human = myIterHuman.next();
if (obj_Human.surname.equals("Smith"))
myIterHuman.remove();
}

Есть ли более лаконичный способ удалить из humanHashSet объект-класс, в котором surname = "Smith"?

Спасибо.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500652
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитать учебники и запомнить, с какой версии Java оператор for научился "ходить" по коллекциям?
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500659
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

а с CME что делать?
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500665
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А каким боком синхронизация потоков к написанию цикла "руками компилятора"?
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500666
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

как насчет чтения документации?

CMENote that this exception does not always indicate that an object has been concurrently modified by a different thread. If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception. For example, if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this exception.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500669
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже так:

HashSetThe iterators returned by this class's iterator method are fail-fast: if the set is modified at any time after the iterator is created, in any way except through the iterator's own remove method, the Iterator throws a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500671
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

если вы на 8ке, то там есть java.util.Collection#removeIf
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500672
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я уже сообразил, о чём вы.
Возможны три ответа.
1. В исходном коде автора эта проблема не беспокоит. Если аналогичный цикл создаст компилятор - ситуация не изменится;
2. Если известно, что удалить надо строго один объект, то:
Код: sql
1.
if (условие) { удалить; break; }

вполне решает проблему "досрочного прекращения итерации";
3. Ну так сложите всё найденное в отдельную коллекцию и удалите их из исходной после выхода из цикла.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500675
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловHashSetif the set is modified at any time after the iterator is created, in any way except through the iterator's own remove method К слову о чтении документации.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500676
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

в коде ТС с CME проблем никаких нет, зато есть вот тут:

Basil A. SidorovПочитать учебники и запомнить, с какой версии Java оператор for научился "ходить" по коллекциям?
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500677
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovДа, я уже сообразил, о чём вы.
Возможны три ответа.
1. В исходном коде автора эта проблема не беспокоит. Если аналогичный цикл создаст компилятор - ситуация не изменится;
2. Если известно, что удалить надо строго один объект, то:
Код: sql
1.
if (условие) { удалить; break; }

вполне решает проблему "досрочного прекращения итерации";
3. Ну так сложите всё найденное в отдельную коллекцию и удалите их из исходной после выхода из цикла.

Вот такой есть работающий вариант:
humanHashSet.remove(new Human("Will"));
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500681
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВот такой есть работающий вариант:
humanHashSet.remove(new Human("Will"));Я рад, но ваша ответ никак не связан с сообщением, которое вы процитировали.
Ну или надо было оставить кусок про три варианта и написать, что есть четвёртый.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500683
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловв коде ТС с CME проблем никаких нет, зато есть вот тут:Basil A. SidorovПочитать учебники и запомнить, с какой версии Java оператор for научился "ходить" по коллекциям?Подумал ещё немного и понял, что частично вы правы. Но - частично.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500684
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор учится использовать коллекции. А вы перешагнули через курс и прыгнули в CME. Как ваш дискурс ему поможет?
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500689
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Научится отличать явные итерации от неявных.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500692
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНо - частично.
Вы же понимаете, что в:
Basil A. Sidorov3. Ну так сложите всё найденное в отдельную коллекцию и удалите их из исходной после выхода из цикла.
конечный результат может быть иным, нежели чем через Iterator.remove? Т.е. итерируетесь вы по объектам, а удалять оно будет по совпадению hashCode и положительному equals.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500693
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПочитать учебники и запомнить, с какой версии Java оператор for научился "ходить" по коллекциям?
Подскажите, как можно использовать for для коллекций?
Насколько я уже знаю 'for' нельзя использовать для удаления объектов из коллекции. Только через 'Iterator' и 'while'.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500696
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну книжки же читать, её-моё
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public class Test {
  public static void main(String[] args) {
    String arg;
    if (args.length == 0)
      arg = "";
    else
      arg = args[0];

    java.util.HashSet<Human> humanSet = new java.util.HashSet<Human>();

    humanSet.add(new Human("Bull"));
    humanSet.add(new Human("Bull"));
    humanSet.add(new Human("Smith"));
    humanSet.add(new Human("Will"));

    java.util.HashSet<Human> bucket = new java.util.HashSet<Human>();
    for (Human person : humanSet ) {
      if ( arg.equals(person.getName()) ) {
        bucket.add(person);
      }
    }
    System.out.println("Person for remove: " + bucket.size());

    for (Human person : bucket) {
      humanSet.remove(person);
    }
    bucket.clear();
  }
}

class Human {
  private final String name;
  Human(String arg) { this.name = arg; }
  String getName() { return name; }
}


P.S. Google-/forum-driven learning ещё никого до добра не доводило.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500697
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловконечный результат может быть иным, нежели чем через Iterator.remove? Т.е. итерируетесь вы по объектам, а удалять оно будет по совпадению hashCode и положительному equals.Воспроизводимый пример будет?

P.S. Я вот не поленился и допилил свой вариант постановки автора до рабочего состояния.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500700
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напишите ему с ::removeIf(...)
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500703
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВоспроизводимый пример будет?В случае Set слишком надуманно получается (что само по себе не отменяет того, что подходы не эквивалентные):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
class Human {

    private final String name;

    private int i;

    Human(String arg) {
        this.name = arg;
    }

    String getName() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Human)) {
            return false;
        }
        Human human = (Human) o;
        return Objects.equals(name, human.name);
    }

    @Override
    public int hashCode() {
        return i++;
    }

}


а на списках довольно очевидно - достаточно чтобы поле, по которому осуществляется фильтрация не участвовало в equals.
Basil A. SidorovP.S. Я вот не поленился и допилил свой вариант постановки автора до рабочего состояния.
Лаконичнее получилось?
MolasarЕсть ли более лаконичный способ удалить из humanHashSet объект-класс, в котором surname = "Smith"?
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500707
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarНасколько я уже знаю 'for' нельзя использовать для удаления объектов из коллекции.
Да откуда вы берёте все эти глупости?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public class Test {
  public static void main(String[] args) {
    String arg;
    if (args.length == 0)
      arg = "";
    else
      arg = args[0];

    java.util.HashSet<Human> humanSet = new java.util.HashSet<Human>();

    humanSet.add(new Human("Bull"));
    humanSet.add(new Human("Bull"));
    humanSet.add(new Human("Smith"));
    humanSet.add(new Human("Will"));

    int count = 0;
    for (java.util.Iterator<Human> iterator = humanSet.iterator();;) {
      if (!iterator.hasNext()) break;
      Human person = iterator.next();
      if (arg.equals(person.getName())) {
        iterator.remove();
        count += 1;
      }
    }
    System.out.println("Person removed: " + count);
  }
}

class Human {
  private final String name;
  Human(String arg) { this.name = arg; }
  String getName() { return name; }
}

Только через 'Iterator' и 'while'.Если вы не в состоянии переписать один вид цикла через другой - это ваши личные проблемы.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500708
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Basil A. Sidorov]
Код: sql
1.
2.
//      Human person = ;
      if (arg.equals(iterator.next().getName())) {

Исправил.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500711
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarЕсть ли более лаконичный способ удалить из humanHashSet объект-класс, в котором surname = "Smith"?
Вам решать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class Test {
  public static void main(String[] args) {
    String arg;
    if (args.length == 0)
      arg = "";
    else
      arg = args[0];

    java.util.HashSet<Human> humanSet = new java.util.HashSet<Human>();

    humanSet.add(new Human("Bull"));
    humanSet.add(new Human("Bull"));
    humanSet.add(new Human("Smith"));
    humanSet.add(new Human("Will"));

    java.util.Iterator<Human> iterator = humanSet.iterator();
    while (iterator.hasNext()) if (arg.equals(iterator.next().getName())) iterator.remove();
  }
}

class Human {
  private final String name;
  Human(String arg) { this.name = arg; }
  String getName() { return name; }
}

...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500716
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловВ случае Set слишком надуманно получаетсяТо, что надо каким-то забубённым способом переопределить hashCode() я и без вас догадывался. Но интересен именно пример данных, на которых сработает ваша мина-ловушка.Лаконичнее получилось?Нет. Но CME не возникает. Переопределение hashCode() тоже не должно влиять.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500720
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И никого два объекта "Bull" не смущают?
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500727
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ никого два объекта "Bull" не смущают?Меня - нет.
Я не делал отладку на фактическое удаление, но счётчик моего тестового класса отображает нахождение/удаление нуля одного или двух объектов в зависимости от аргумента комстроки.

P.S.
Вокруг не только люди из анекдотаВысоченный гладкий забор из-за которого свесилась ветка бананового дерева.

Идёт обезьяна, видит банан, начинает прыгать. Не достать - высоко. Внутренний голос подсказывает: "Думай, обезьяна, думай".
Обезьяна останавливается, потом оглядывается, видит палку, берёт её и сбивает банан.

Идёт человек, видит банан, начинает прыгать ... Внутренний голос подсказывает: "Думай, человек, думай".
Человек останавливается, потом пожимает плечами: "Чего тут думать? Прыгать надо!".
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500747
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поцоны. Фиксы давайте!

Еще мой code-review не прошли. Что за этажерка из if-else? Тернарный оператор.
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500749
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТернарный оператор.Не люблю.
if-ы не люблю за висячие строки/скобочки, но "?::" не люблю больше
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500752
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окей! Фиксите инициализацию хешсета... Что за шлак? Да и кстати. Что за чортов хешсет слева!?
Старуха Лисков лупит вас своим костылём!

Фиксите!
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500778
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОкей! Фиксите инициализацию хешсета... Что за шлак? Да и кстати. Что за чортов хешсет слева!?
Старуха Лисков лупит вас своим костылём!"Папа, ты с кем сейчас разговариваешь?"
...
Рейтинг: 0 / 0
HashSet. Удалить объект-класс из HashSet
    #39500794
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВот такой есть работающий вариант:
humanHashSet.remove(new Human("Will"));Можно, кстати, пример класса Human, для которого ваш код будет рабочим?
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / HashSet. Удалить объект-класс из HashSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]