簡體   English   中英

從 HashMap 條目列表中刪除重復項

[英]Remove Duplicates from List of HashMap Entries

我有一個List<HashMap<String,Object>>代表一個數據庫,其中每個列表記錄都是一個數據庫行。

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

什么是有效的方法?

僅供參考 - 我在查詢數據庫時無法執行不同的操作,因為在加載數據庫后,稍后將 GroupName 添加到Map 由於 Id 列不是主鍵,因此一旦將 GroupName 添加到Map 您將有基於 Id + GroupName 組合的重復項!

希望我的問題有意義。 如果我們需要更多說明,請告訴我。

  1. 創建一個比較 HashMaps 的 Comparator,並通過比較您感興趣的鍵/值對來比較它們。
  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)。

我遇到了同樣的情況,經過大量搜索,最終以下解決方案對我有用。

  1. 創建POJO,覆蓋equal () & hashCode ()。
  2. 相等性應該在所有具有 .equal 比較的數據成員上。
  3. 哈希碼計算為Objects.hash(filed1, field2, ...) ;
  4. 遍歷列表並構造POJO 對象並將其添加到 HashSet

下面是代碼——

/* (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj) {
    if( this == obj) {
        return true;
    }
    if( null == obj || getClass() != obj.getClass()) {
        return false;
    }

    Pojo rest = (Pojo) obj;
    return field1.equals(rest.field1) && field2.equals(rest.field2) && field3.equals(rest.field3); 
}

/* (non-Javadoc)
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode() {
    return Objects.hash(field1, field2, field3);
}

Set<Pojo> pathSet = new HashSet<>();
//Iterate over list and construct pojo object here
Pojo pojo = new Pojo(value1, value2, value3)
pathSet.add(pojo)

謝謝,

我已經學習了一個 Employee 類並使用 Integer,Employee 對象創建了 Map 作為鍵值對,這里是我的 Map

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

Employee 類是一個 bean 類,它具有 name、id、designation 等屬性; map 允許唯一鍵。 但是如果你不想在你的地圖中允許重復的值,你必須在 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;
}  

在向 Map 添加鍵值時,您必須使用 contains 方法

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

containsValue內部調用equals()方法,因此您可以使用 equals 方法,它將檢查每個值(對象)與以前的對象,如果哈希碼相同,則返回 true 表示兩者都是相同的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM