Удалить элемент из набора

Обновить

December 2018

Просмотры

24.2k раз

6

Я пытаюсь удалить все строки, которые четная длиной в наборе. Вот мой код до сих пор, но у меня возникают проблемы при получении индекса из итератора в развернутом-для цикла.

public static void removeEvenLength(Set<String> list) {
    for (String s : list) {
        if (s.length() % 2 == 0) {
            list.remove(s);
        }
    }
}

3 ответы

4

Просто думал , что я отправлю решение Java 8 , который может помочь кому - то в будущем. Java 8 Streams предлагает кучу хороших методов , таких как filterи collect. filterМетод просто отфильтровывает элементы из потока , который должен быть осуществлен к следующему шагу. collectМетод сочетает в себе элементы в Collectionкаком - то или Map.

// The data to filter
final Set<String> strings = 
        new HashSet<>(Arrays.asList("a", "ab", "abc", "abcd"));

// Now, stream it!
final Set<String> odds =
        strings.stream()
               .filter(s -> s.length() % 2 != 0) // keep the odds
               .collect(Collectors.toSet());     // collect to a new set

Это на самом деле не изменить оригинальную коллекцию , но и создает новый , Setсодержащие Stringобъекты нечетной длины.

Для более чтений на Java 8 потоков, проверка этого отличный учебник от Oracle или больших JavaDocs .

18

SetНе имеет понятия индекса элемента. Эти элементы не имеют порядка в наборе. Кроме того, вы должны использовать Iteratorпри переборе чтобы избежать ConcurrentModificationExceptionпри удалении элемента из коллекции в то время как цикл над ним:

for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
    String s =  iterator.next();
    if (s.length() % 2 == 0) {
        iterator.remove();
    }       
}

Обратите внимание на вызов Iterator.remove()вместо Set.remove().

3

Вам не нужно индекс. Но вам нужно явное Iterator. Итератор имеет remove()метод , без параметров, который удаляет текущий элемент из коллекции.

Iterator<String> itr = list.iterator();  // list is a Set<String>!
while (itr.hasNext())
{
    String s = itr.next();
    if (s.length() % 2 == 0) {
        itr.remove();
    }
}