2015-09-11 51 views
0

我正在開發一個應用程序,其中作爲背景我需要監視特定對象上的用戶活動,並在以後可視化時需要根據其順序對其進行排序用戶使用它們(例如,最後使用的對象必須在網格的第一行上可視化)。我應該實現List接口還是擴展Java中的ArrayList類

所以,如果我有一個Arraylist存儲用戶正在處理的對象以添加最後一個使用的對象,我需要檢查它是否已經在列表中,然後將它移動到第一個位置。如果對象不在那裏,我只需將它添加到列表的第一個位置。

因此,我不想做所有這些步驟,而是想讓自己的列表在上面提供的邏輯可用。

最後我的問題是(希望它不是基於意見),該方案是更好:

  1. 實現list接口
  2. 擴展ArrayList類和重寫Add方法

提前10倍。

+0

我想你在找什麼叫['HashMap'](https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html) – Oceans

+0

爲什麼要使用Hashmap? –

+0

它允許您動態添加項目並根據密鑰進行搜索。您還可以嵌套HashMap來獲取樹結構,這應該允許您將所有必要的信息保存在一起。 – Oceans

回答

3
  1. 創建一個包含ArrayList的類並處理任何其他功能。

I.e.比繼承更喜歡組合(在這種情況下,實現一個接口)。對於相關案例,也可以讓該類實施List,並且只需將(相關)操作指向ArrayList

另請注意,LinkedHashMap支持迭代的插入順序(默認)和訪問順序,如果您不需要List(或者如果您可以用Map來合適替換它)。

+0

我同意開始,但不是結束。轉發到列表要比擴展ArrayList好,但也很難做好(例如,實現迭代器)。我根本不認爲用戶的類應該是一個List。它應該是一個使用列表的類。 –

+0

@JBNizet我同意,實現'List'並不是定期在標準代碼中完成的事情。 – Kayaman

1

我認爲LinkedHashMap已經做到了你所需要的 - 它保持了它們被插入或最後訪問的順序(這由參數accessOrder在一個構造函數中決定)。

https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html

編輯

我沒有足夠的信譽發表評論,所以我把它在這裏:你實際上並不需要一張地圖,所以文卡塔斯的LinkedHashSet建議是更好的。

你可以做這樣的事情:

<T> void update(Set<T> set, T value) { 
     set.remove(value); 
     set.add(value); 
} 

然後

LinkedHashSet<String> set = new LinkedHashSet<>(); 
    update(set, "a"); 
    update(set, "b"); 
    update(set, "c"); 
    update(set, "a"); 

    Iterator<String> it = new LinkedList<String>(set).descendingIterator(); 

    while (it.hasNext()) { 
     System.out.println(it.next()); 
    } 

輸出:

a 
c 
b 
1

因此而不是做所有這些步驟我想我的自己的列表在哪裏 上面解釋的邏輯會我可以使用。

爲了能夠使用現有的Java集合框架類(也許是鏈接的集合類型),我會嘗試重構您的設計參數(如果可以的話)。作爲集合框架的一部分,這些優化和維護已經很多年了(所以效率可能已經接近最佳),並且您不必擔心自己維護它。

你給了兩個選擇,它是可能的,無論是最簡單的還是最好的。

  • 它聽起來並不像你就可以延長AbstractList(爲實現列表的方式),所以你會有很多輪再造要做。

  • ArrayList類不是最終的,但沒有明確設計和記錄繼承。這可能導致一些代碼的脆弱性,因爲繼承破壞了封裝(在J.Bloch的Effective Java,2nd Ed中討論過)。這個解決方案可能不是最好的選擇。

的選項,如果你不能重構你的設計允許使用的集合類直接,然後寫一個封裝List類(或其他徵收)作爲一個實例字段並添加儀器將它。 喜歡繼承。通過這種方式,與基於繼承的解決方案相比,您的解決方案將更加可靠並且更易於維護。

0

一個LinkedHashSet也可以在你的情況有所幫助。您可以繼續將元素添加到它,它就會讓他們在插入順序,也將只保留獨特值。

+0

我希望最後添加的是第一個索引 –

+0

錯過了,在這種情況下,Cinnam和Kayaman提到的LinkedHashMap應該適合您。 –

+0

所以,我可以使linkedhashmap反轉插入順序嗎? –

1

您可以嘗試使用HashMap<Integer, TrackedObject>其中TrackedObject是類你跟蹤的對象。

當用戶使用一個對象,做

void trackObject(TrackedObject object) 
{ 
    int x = hashMap.size(); 
    hashMap.add(Integer.valueOf(x), object); 
} 

那麼當你想使用的順序讀出跟蹤對象:

TrackedObject[] getOrderedArray() 
{ 
    TrackedObject[] array = new TrackedObject[hashMap.size()]; 
    for(int i = 0; i < hashMap.size(); i++) 
    { 
    array[i] = hashMap.get(Integer.valueOf(i)); 
    } 
    return array; 
} 
相關問題