簡體   English   中英

從哈希圖列表中消除重復項並計算其支持

[英]Eliminate duplicates from hashmap list and count their support

我有一個itemMap列表( Map<ArrayList<String>, Integer> itemMap = new HashMap<ArrayList<String>, Integer>() )包含以下要素

 { [File3, File2]=4, 
   [File2, File3]=2, 
   [File1, File2]=6,
   [File1, File3]=2, 
   [File3, File1]=6,
   [File2, File1]=6 }

我想獲取一個沒有重復的列表。 (在我的情況下,重復項是包含另一個列表的相同元素的列表)。示例(F1,F2)和(F2,F1)在我的工作中是相同的。

所以我想獲得以下結果:

{ [File3, File2]=6, 
  [File1, File3]=8, 
  [File1, File2]=12 }

如您所見,我將重復項的總數相加,但是將其中一個重復項保留在哈希圖中。 任何人都可以用簡單的代碼幫助我,謝謝。 我自己的嘗試失敗了:

HashMap<List<String>,Integer>   myobjectListB  = new HashMap<List<String>,Integer>();
        for (List <String> key : itemMap.keySet()){
            for (List <String> y : itemMap.keySet()){
            if((key.containsAll(y) && (!key.equals(y))) && (key.size())==y.size()) {
                int count = itemMap.get(key)+itemMap.get(y);
                myobjectListB.put(key, count);


            }   

            }

        }
        System.out.println("object list"+ myobjectListB);

    }

如果用HashSet替換ArrayList ,它將按照您的HashSet方式工作。 這是因為Map接口每個鍵只存儲一個值,並且使用equals方法確定兩個鍵是否相等。 比較時,兩個包含相同對象的ArrayList會返回false ,但是兩個包含不同對象的HashSet會返回true

我寫了一種方法,可以在其中獲得沒有重復的新地圖。 當您將值添加到新映射時,它將始終檢查列表是否包含在keyset集中,還檢查交換列表是否也包含在keyset集中。 因此不會有任何重復。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Map<ArrayList<String>, Integer> itemMap = new HashMap<ArrayList<String>, Integer>();
        itemMap.put(new ArrayList<>(Arrays.asList("File3", "File2")), 4);
        itemMap.put(new ArrayList<>(Arrays.asList("File2", "File3")), 2);
        itemMap.put(new ArrayList<>(Arrays.asList("File1", "File2")), 6);
        itemMap.put(new ArrayList<>(Arrays.asList("File1", "File3")), 2);
        itemMap.put(new ArrayList<>(Arrays.asList("File3", "File1")), 6);
        itemMap.put(new ArrayList<>(Arrays.asList("File2", "File1")), 6);

        System.out.println(removeDuplicates(itemMap));
    }

    static Map<ArrayList<String>, Integer> removeDuplicates(Map<ArrayList<String>, Integer> map) {
        Map<ArrayList<String>, Integer> convertedMap = new HashMap<ArrayList<String>, Integer>();

        for (ArrayList<String> list : map.keySet()) {
            if (!convertedMap.keySet().contains(list)) {
                Collections.swap(list, 0, 1);
                if (!convertedMap.keySet().contains(list)) {
                    convertedMap.put(list, map.get(list));
                }
            }
        }
        return convertedMap;

    }
}

暫無
暫無

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

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