我想按键对两个HashMaps进行排序并比较它们的值并打印出所有没有相同值的键。你能帮我怎么做这是我的代码如下。我是Java的新手,一个接一个地学习数据结构。谢谢你的帮助。
代码: -
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int val;
int n = scan.nextInt();
HashMap<Integer,Integer> h1 = new HashMap<Integer,Integer>();
for( int i=0;i<n;i++ ) {
val = scan.nextInt();
if(!h1.containsKey(val)) {
h1.put(val,1);
}
else {
h1.put(val,h1.get(val)+1);
}
}
int m = scan.nextInt();
HashMap<Integer,Integer> h2 = new HashMap<Integer,Integer>();
for( int i=0;i<m;i++ ) {
val = scan.nextInt();
if(!h2.containsKey(val)) {
h2.put(val,1);
}
else {
h2.put(val,h2.get(val)+1);
}
}
System.out.println(h1.keySet());
System.out.println(h1.values());
System.out.println(h2.keySet());
System.out.println(h2.values());
}
}
答案 0 :(得分:2)
您无需对哈希映射进行排序即可生成所需的输出。相反,构造一个TreeSet<Integer>
包含来自两个映射的键的并集,如此
SortedSet<Integer> allKeysSorted = new TreeSet<Integer>();
allKeysSorted.addAll(h1.keySet());
allKeysSorted.addAll(h2.keySet());
使用TreeSet
可确保您的密钥已排序。现在,您可以迭代allKeysSorted
,从每个地图中获取相应的值,并进行相应的比较:
for (Integer key : allKeysSorted) {
int v1, v2;
if (h1.containsKey(key)) {
v1 = h1.get(key);
} else {
v1 = 0;
}
if (h2.containsKey(key)) {
v2 = h2.get(key);
} else {
v2 = 0;
}
... // Compare v1 and v2 here
}
答案 1 :(得分:1)
应该允许您对地图进行排序。
SortedSet<Integer> values1 = new TreeSet<Integer>(h1.keySet());
SortedSet<Integer> values2 = new TreeSet<Integer>(h2.keySet());
应返回具有两组唯一值的集合。
Set<Integer> result = new SortedSet<Integer>(values1);
for (Integer element : values2) {
if (!h1.containsValue(h2.get(element)) { //If they don't share same value, add it to this new Set
result.add(element);
}
result.remove(element); //If they both share same value, remove it
}
最后,打印:
Iterator iter = result.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
答案 2 :(得分:0)
一种方法是合并h1
和h2
条目,将其值减去新的TreeMap
,按键对条目进行排序。然后,我们可以删除值等于零的条目:
Map<Integer, Integer> merged = new TreeMap<>(h1); // Copy h1 into merged
h2.forEach((k2, v2) -> merged.merge(k2, v2, (oldVal, newVal) -> oldVal - newVal));
merged.values().removeIf(v -> v.equals(0));
要打印密钥,您只需打印地图的密钥集:
System.out.println(merged.keySet());
或者迭代它的键并逐个打印:
merged.keySet().forEach(System.out::println);