Java 从hashmap列表中消除重复项并计算其支持度
我有一个Java 从hashmap列表中消除重复项并计算其支持度,java,hashmap,Java,Hashmap,我有一个itemMap(Map itemMap=newhashmap()) 包含以下元素 { [File3, File2]=4, [File2, File3]=2, [File1, File2]=6, [File1, File3]=2, [File3, File1]=6, [File2, File1]=6 } 我想获得一个不包含重复项的列表。(在我的例子中,副本是包含另一个列表的相同元素的列表)。示例(F1,F2)和(F2,F1)在我的作品中是相同的 所以
itemMap
(Map itemMap=newhashmap()
)
包含以下元素
{ [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中保留了一个重复项。
谁能帮我一个简单的代码,谢谢。
我自己的尝试失败了:
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);
}
HashMap myobjectListB=newhashmap();
for(列表键:itemMap.keySet()){
对于(列表y:itemMap.keySet()){
如果((key.containsAll(y)&&(!key.equals(y))&&&(key.size())==y.size()){
int count=itemMap.get(key)+itemMap.get(y);
myobjectListB.put(键,计数);
}
}
}
System.out.println(“对象列表”+myobjectListB);
}
我写了一个方法,在这个方法中,你可以得到一个没有重复的新地图。向新映射添加值时,它始终会检查列表是否包含在键集中
,并检查交换列表是否也包含在键集中
。所以不会有任何重复
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;
}
}
import java.util.*;
公共班机{
公共静态void main(字符串[]args){
Map itemMap=newhashmap();
itemMap.put(新的ArrayList(Arrays.asList(“File3”、“File2”)),4);
itemMap.put(新的ArrayList(Arrays.asList(“File2”、“File3”)),2);
itemMap.put(新的ArrayList(Arrays.asList(“File1”、“File2”)),6);
itemMap.put(新的ArrayList(Arrays.asList(“File1”、“File3”)),2);
itemMap.put(新的ArrayList(Arrays.asList(“File3”、“File1”)),6);
itemMap.put(新的ArrayList(Arrays.asList(“File2”、“File1”)),6);
System.out.println(移除的副本(itemMap));
}
静态地图移除副本(地图地图){
Map convertedMap=newhashmap();
for(ArrayList列表:map.keySet()){
如果(!convertedMap.keySet()包含(列表)){
集合交换(列表,0,1);
如果(!convertedMap.keySet()包含(列表)){
convertedMap.put(list,map.get(list));
}
}
}
返回转换地图;
}
}
如果将ArrayList
替换为HashSet
,它将按您所希望的方式工作。这是因为Map
接口只为每个键存储一个值,并使用equals
方法确定两个键是否相等。比较时,两个ArrayList
s以不同顺序包含相同对象将返回false
,但两个HashSet
s以不同顺序包含相同对象将返回true
我自己做了尝试,但结果是错误的,我编辑了帖子,我把我的尝试放进去了。不包含重复项的列表通常称为集合。如果顺序重要,您是否尝试过HashSet或LinkedHashSet?