我想要做的是刪除集合中小於指定對象的所有元素。這是我的:刪除集合中的元素
static void removeAllLessThan(Collection c, Object x) {
for(Object a : c) if(a.compareTo(x) < 0) c.remove(a);
}
這是行不通的,因爲Object沒有compareTo方法。我想知道的是我應該如何比較對象?另外什麼是自然比較器?謝謝。
我想要做的是刪除集合中小於指定對象的所有元素。這是我的:刪除集合中的元素
static void removeAllLessThan(Collection c, Object x) {
for(Object a : c) if(a.compareTo(x) < 0) c.remove(a);
}
這是行不通的,因爲Object沒有compareTo方法。我想知道的是我應該如何比較對象?另外什麼是自然比較器?謝謝。
使用Collection<Comparable>
而不是Collection
,並執行Comparable
到集合中的所有項目。然而
static <T> void removeAllLessThan(Collection<T> collection, T t) {...}
這是不夠的,:使用泛型
static void removeAllLessThan(Collection<Comparable> c, Comparable x) {
for (Iterator<Comparable> it = c.iterator(); it.hasNext();)
if (it.next().compareTo(x) < 0)
it.remove();
}
開始,然後讓調用者聲明,他希望通過過濾什麼類型的對象:改變你的方法等。您需要使用Comparator<T>
來提供排序。
static <T> void removeAllLessThan(Collection<T> collection,
Comparator<T> comparator, T t) {...}
然後,允許用戶在使用繼承時有一定的靈活性。他要做的t1 < t2
的相當,但比較可能的T任超,並收集可以是任何擴展T:
static <T> void removeAllLessThan(Collection<? extends T> collection,
Comparator<? super T> comparator, T t) {...}
然後,有一個與刪除過程中出現錯誤。在遍歷集合時可以從集合中刪除的唯一機制是Iterator
。其他任何風險ConcurrentModificationException
。
static <T> void removeAllLessThan(Iterable<? extends T> iterable,
Comparator<? super T> comparator, T t) {
for (Iterator<? extends T> it = iterable.iterator(); it.hasNext();) {
if (comparator.compare(it.next(), t) < 0) {
it.remove();
}
}
}
請注意簽名更改。
最後,這是一個非常具體的方法。你需要編寫大量的像removeIfGreaterThan,removeIfEqualIgnoringCase等幾乎相同的方法寫一個通用的方法removeIf
與簽名
public <T> removeIf(Iterable<? extends T> iterable,
Predicate<? super T> predicate){...}
Predicate
是具有隻是一個布爾eval
方法,通過大量的庫提供的接口。
有兩種方法可以解決這個問題。
首先,可以使用Comparable
接口,這意味着該方法應被變更爲:
static void removeAllLessThan(Collection<Comparable> c, Comparable x) {
for(Comparable a : c) if(a.compareTo(x) < 0) c.remove(a);
}
一個目的應當與有一個叫做comparedTo
方法。
其次,您可以執行Comparator
來判斷哪個更大。如果您不希望該對象具有可比性,這意味着您不想更改現有代碼以使其實現Comparable
,這是更好的方法。但是,該代碼將變爲:
static void removeAllLessThan(Collection c, Object x, Comparator comp) {
for(Object a : c) if(comp(a, x) < 0) c.remove(a);
}
這裏是Comparable和Comparator的Javadoc。
'c'是對象的集合? –
爲什麼不使用實現'compareTo'而不是'Object'的類? – 2013-04-17 06:31:54
因爲我想讓它適用於任何對象 – GullDe