从集中删除元素

时间:2015-01-27 19:36:33

标签: java string foreach set string-length

我试图删除一组中长度均匀的所有字符串。到目前为止,这是我的代码,但是我无法在增强型for循环中从迭代器获取索引。

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

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:6)

想到我发布的Java 8解决方案可以帮助将来的某个人。 Java 8 Streams提供了许多不错的方法,例如filtercollectfilter方法只是过滤掉流中应该继续执行下一步的元素。 collect方法将元素组合为某种CollectionMap

// 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 Streams的更多信息,请查看此excellent tutorial from Oraclegreat JavaDocs

答案 2 :(得分:3)

您不需要索引。但是你确实需要明确的Iterator。迭代器具有remove() method,没有参数,可以从集合中删除当前项。

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

答案 3 :(得分:2)

Java 8引入了Collection.removeIf(),可让您执行以下操作:

set.removeIf(s -> s.length() % 2 == 0)