我有一个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);
}
答案 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;
}
}