2010-02-03 71 views
2

我有一個List<HashMap<String,Object>>它代表一個數據庫,其中每個列表記錄是一個數據庫行。從HashMap條目列表中刪除重複項

我在我的數據庫中有10列。有幾行,其中2個特定列的值相等。在使用數據庫中的所有行更新列表後,我需要從列表中刪除重複項。

什麼是有效的方法?

僅供參考 - 我無法在查詢數據庫時執行截然不同的操作,因爲在加載數據庫後,GroupName稍後會添加到Map。由於Id列不是主鍵,所以一旦將GroupName添加到Map。你將有基於Id + GroupName組合的重複項!

希望我的問題有道理。讓我知道如果我們需要更多的澄清。

+0

問題:哪些需要刪除,哪些需要保留? – BalusC 2010-02-03 21:12:32

+0

爲什麼你在第一個地方插入重複項?我的意思是,爲什麼不在插入時檢查重複項? – 3lectrologos 2010-02-03 21:20:32

+0

我已經在我的問題中給出了原因。HashMap中的值在從數據庫初始加載後更新。因此,我可以首先應用重複條件的原因。 – jagamot 2010-02-03 21:37:40

回答

3
  1. 創建比較HashMaps這樣一比較,並通過比較你所感興趣的鍵/值對它們進行比較
  2. 使用Collections.sort(yourlist, yourcomparator)
  3. 現在,所有基於比較器彼此相似的地圖在列表中都相鄰。
  4. 創建一個新列表。
  5. 遍歷你的第一個列表,跟蹤你上次看到的內容。如果當前值與上次不同,請將其添加到新列表中。
  6. 根據比較器,您的新列表不應該包含重複項。

遍歷列表的代價是O(n)。排序是O(n log n)。所以這個算法是O(n log n)。

我們也可以通過使用具有該比較器的TreeSet進行即時排序。插入是O(log n)。我們必須這樣做n次。所以我們得到O(n log n)。

+0

我希望這個解決方案也是有效的,即使我的列表超過1百萬行! – jagamot 2010-02-03 21:46:09

+1

值得注意的是,對於大多數集合,包括HashMap,您可以簡單地移除()重複的對象。使用HashMap,您將密鑰傳遞給remove()。所以你不需要重複的List或Map。 – jonescb 2010-02-03 21:51:02

+4

Java內存中有100萬行是什麼?你爲什麼實際上在Java的內存中複製數據庫?我認爲這個問題需要在別的地方解決。只需在數據庫中更新,而不是在Java內存中進行更新,並利用約束來防止重複。 – BalusC 2010-02-03 22:10:00

1

我已經邁出了Employee類 與整型,Employee對象爲鍵值對創建地圖 這裏是我的地圖

Map<Integer,Employee> map = new HashMap<Integer,Employee>(); 

Employee類bean類,它具有類似名稱,ID屬性,指定; 地圖允許唯一的密鑰。但如果您不想在地圖中允許重複值 ,則必須在bean類中使用equals方法。

@Override 
public boolean equals(Object object){ 
    if (object == null) return false; 
    if (object == this) return true; 
    if (this.getClass() != object.getClass())return false; 
    Employee employee = (Employee)object; 
    if(this.hashCode()== employee.hashCode())return true; 
    return false; 
} 

,並同時增加鍵值,以地圖,你必須使用含有方法

if(!map.containsValue(map.get(id))){ 
    map.put(id,employee); 
} 

containsValue內部調用equals()方法,因此你在騎equals方法 它會檢查每一個值(對象)與先前的對象,如果散列碼相同 它返回true意味着兩者都是相同的對象。