powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / HashSet. Удалить объект-класс из HashSet
25 сообщений из 32, страница 1 из 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
25 сообщений из 32, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / HashSet. Удалить объект-класс из HashSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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