从集合中移除元素
Remove Element from Set
我正在尝试删除集合中所有长度相等的字符串。到目前为止,这是我的代码,但我无法从增强型 for 循环中的迭代器获取索引。
public static void removeEvenLength(Set<String> list) {
for (String s : list) {
if (s.length() % 2 == 0) {
list.remove(s);
}
}
}
A 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()
。
您不需要索引。但是您确实需要明确的 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();
}
}
我只是想 post 一个 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 条流的更多信息,请查看此 excellent tutorial from Oracle or the great JavaDocs。
Java 8 引入了Collection.removeIf(),它允许你做:
set.removeIf(s -> s.length() % 2 == 0)
我正在尝试删除集合中所有长度相等的字符串。到目前为止,这是我的代码,但我无法从增强型 for 循环中的迭代器获取索引。
public static void removeEvenLength(Set<String> list) {
for (String s : list) {
if (s.length() % 2 == 0) {
list.remove(s);
}
}
}
A 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()
。
您不需要索引。但是您确实需要明确的 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();
}
}
我只是想 post 一个 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 条流的更多信息,请查看此 excellent tutorial from Oracle or the great JavaDocs。
Java 8 引入了Collection.removeIf(),它允许你做:
set.removeIf(s -> s.length() % 2 == 0)