删除集合中元素的所有实例
我需要删除集合c中小于给定对象的所有元素。删除集合中元素的所有实例
签名应该为void removeLess(Collection c, Object o)
会是这样的工作?:
void removeLess(Collection c, Object o) {
Iterator<Integer> itr = c.iterator();
while (itr.hasNext()) {
if (itr.next.compareTo(o) < 0) {
c.remove(o);
}
}
}
您不能使用c.remove(o)
或您使迭代器无效;但您可以使用可选方法Iterator.remove()
,如itr.remove()
中所述。它删除从“下一个”返回的最后一个对象。
它看起来会,前提是Collection
类的Iterator
支持remove
方法。
而你有一个语法错误 - 应该是itr.next()
。
另外,试试吧?
他没有调用itr.remove(),他调用c.remove(o)。 – 2011-04-20 18:44:03
刚才注意到了。代码有几个错误。 – Finbarr 2011-04-20 18:44:35
不,它不起作用,因为在存在Iterator
的情况下无法修改集合。您应该将要删除的元素累积到另一个临时集合中,然后将其全部删除。
如果您不关心元素所在的索引,则更好的方法是使用TreeSet<T>
类,该类根据结构提供方法tailSet(T element)
,该方法完全符合您的需要。
你将不得不使用Iterator
的remove
方法来代替,并且签名将需要:
<E extends Comparable<? super E>> void removeLess(Collection<E> c, E o)
随着如TreeSet
NavigableSet<E>
,你可能只是做:
set.headSet(o).clear();
_“会这样的工作?”,为什么不尝试呢? – 2011-04-20 18:43:03
答案解释了为什么这不起作用,而且,我不认为'o'确实是你的意思是要删除。 – 2011-04-20 21:55:23
和'o'必须是一个'Integer'才能工作。在番石榴的下一个版本中,你可以像“Iterables.removeIf(c,Ranges.lessThan(o))'这样做。 – 2011-04-20 21:56:22