从哈希图列表中消除重复项并计算其支持

时间:2018-12-22 11:14:52

标签: java hashmap

我有一个itemMapMap<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);

    }

2 个答案:

答案 0 :(得分:1)

如果将ArrayList替换为HashSet,它将按照您的预期方式工作。这是因为Map接口每个键仅存储一个值,并且使用equals方法确定两个键是否相等。比较时,包含相同对象的两个ArrayList将返回false,但是包含相同对象的两个HashSet将返回true

答案 1 :(得分:0)

我写了一个方法,您可以在其中获得一个没有重复的新地图。当您向新地图添加值时,它将始终检查列表是否包含在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;

    }
}