2013-04-17 104 views
0

我想要做的是刪除集合中小於指定對象的所有元素。這是我的:刪除集合中的元素

static void removeAllLessThan(Collection c, Object x) { 
    for(Object a : c) if(a.compareTo(x) < 0) c.remove(a); 
} 

這是行不通的,因爲Object沒有compareTo方法。我想知道的是我應該如何比較對象?另外什麼是自然比較器?謝謝。

+0

'c'是對象的集合? –

+3

爲什麼不使用實現'compareTo'而不是'Object'的類? – 2013-04-17 06:31:54

+0

因爲我想讓它適用於任何對象 – GullDe

回答

1

使用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(); 
} 
0

開始,然後讓調用者聲明,他希望通過過濾什麼類型的對象:改變你的方法等。您需要使用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方法,通過大量的庫提供的接口。

0

有兩種方法可以解決這個問題。

首先,可以使用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); 
} 

這裏是ComparableComparator的Javadoc。