2012-03-07 75 views
2

這是一個我有困難的作業問題。該類骨架下面給出:如何實現一個實現集合的模板類

public class Storage<E> implements java.util.Collection<E> { 
private Object[] data = new Object[256]; 
private int nextEmptySlot = 0; 

@Override 
public java.util.Iterator<E> iterator() { 
    // returns a class that iterates over the data array 
    return new java.util.Iterator() { 
     // insert the body of the inner class here 
     // 3 methods: remove(), hasNext(), next() 
     }; 
    } 
//Override all methods required by the interface 
} 

現在我有麻煩正在寫的功能,如包含(對象o),因爲模板不電動勢E具有可比性。我如何將模板類型E視爲可比較的,以便我可以使用equals和compateTo?我知道有很多方法可以做到這一點在類的聲明,但是在類聲明中給出的,不需要E至可以媲美......

+0

您可以編輯代碼嗎? – 2012-03-07 01:23:13

回答

3

你不應該需要compareTo(),因爲這會給你一個元素排序的定義(儘管它可以告訴你兩個對象是否相等)。除非訂單在這裏很重要,否則這不會是你想要的。

如果訂單不是必需的假設是正確的,那麼您應該只需要依賴的是集合中每個實例的equals()方法。

  1. 如果E適當覆蓋equals()hashCode()方法,E本身就能確定元素在此集合中。
  2. 如果它沒有超過equals()方法,那麼實例將依賴Objectequals()的實現,它簡單地比較引用(如果它們都非空)。

我會建議確保您首先明確此作業的要求。如果需求說明更具體的內容,則可以確定收集中的平等性。如果你不能得到更清楚的東西,我相信你唯一的選擇就是依靠E執行equals()

+0

我想這是我應該做的。只用equals(),編譯器沒有抱怨,它運行得很好!謝謝。 – Arcturus 2012-03-07 05:03:16

0

可以綁定的E型

public class Storage<E **extends Comparable**> implements java.util.Collection<E> 

而且可以參數化可比較的,因爲你也需要。

+0

該OP說,這不是一個選項 – 2012-03-07 01:24:34

+0

可能不想要一個罕見的類型! – 2012-03-07 01:43:37

+0

啊,是的,對不起。我錯過了。我不知道他無法改變模板。 – 2012-03-07 02:15:02

3

實現排序的唯一集合是SortedMapSortedSet,並且它們都沒有對類型參數進行綁定。在內部,我猜想它會轉換爲Comparable<E>,如果失敗則拋出ClassCastExcepton。無序收藏僅取決於equals()hashCode(),並且不需要Comparable

+0

+1等於'。 /如果你看看'TreeMap'類似的東西,你會看到一團糟。 「Comparable」和「Comparator」類型的一個實現,這意味着邊界沒有被強制執行。 – 2012-03-07 01:46:55