删除集合中元素的所有实例

问题描述:

我需要删除集合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); 
     } 
    } 
} 
+2

_“会这样的工作?”,为什么不尝试呢? – 2011-04-20 18:43:03

+0

答案解释了为什么这不起作用,而且,我不认为'o'确实是你的意思是要删除。 – 2011-04-20 21:55:23

+1

和'o'必须是一个'Integer'才能工作。在番石榴的下一个版本中,你可以像“Iterables.removeIf(c,Ranges.lessThan(o))'这样做。 – 2011-04-20 21:56:22

您不能使用c.remove(o)或您使迭代器无效;但您可以使用可选方法Iterator.remove(),如itr.remove()中所述。它删除从“下一个”返回的最后一个对象。

它看起来会,前提是Collection类的Iterator支持remove方法。

而你有一个语法错误 - 应该是itr.next()

另外,试试吧?

+0

他没有调用itr.remove(),他调用c.remove(o)。 – 2011-04-20 18:44:03

+0

刚才注意到了。代码有几个错误。 – Finbarr 2011-04-20 18:44:35

不,它不起作用,因为在存在Iterator的情况下无法修改集合。您应该将要删除的元素累积到另一个临时集合中,然后将其全部删除。

如果您不关心元素所在的索引,则更好的方法是使用TreeSet<T>类,该类根据结构提供方法tailSet(T element),该方法完全符合您的需要。

你将不得不使用Iteratorremove方法来代替,并且签名将需要:

<E extends Comparable<? super E>> void removeLess(Collection<E> c, E o) 

随着如TreeSetNavigableSet<E>,你可能只是做:

set.headSet(o).clear();