2011-04-20 111 views
0

我需要刪除集合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

回答

3

您不能使用c.remove(o)或您使迭代器無效;但您可以使用可選方法Iterator.remove(),如itr.remove()中所述。它刪除從「下一個」返回的最後一個對象。

0

它看起來會,前提是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

0

不,它不起作用,因爲在存在Iterator的情況下無法修改集合。您應該將要刪除的元素累積到另一個臨時集合中,然後將其全部刪除。

如果您不關心元素所在的索引,則更好的方法是使用TreeSet<T>類,該類根據結構提供方法tailSet(T element),該方法完全符合您的需要。

0

你將不得不使用Iteratorremove方法來代替,並且簽名將需要:

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

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

set.headSet(o).clear();