我有两个地图集合,比如说, 将值视为整数列表。 即,对于Map1,key = 1,values =带有(2,3)
的数组列表Map1 Map2
<1,2> <1,2>
<1,3> <1,4>
<2,4> <2,5>
<2,5> <2,6>
现在我希望结果为Map1-Map2:
<1,3>
<2,5>
或Map2-Map1:
<1,4>
<2,6>
地图的ArrayLists中是否有像RemoveAll类似的方法?另外,哪个Map(SortedMap?)是实现这个目标的最佳方式?
我是初学者如果你可以指导我正确的方向而不是投票,那就太棒了。
答案 0 :(得分:0)
这是谷歌提供的Guava库。有一个名为entriesOnlyOnLeft()
的方法,它允许您提供两个映射并显示查询左侧地图中的唯一条目。链接到库here
答案 1 :(得分:0)
首先,您必须了解Map
中的Java
。您不能拥有重复的keys
。如果您使用相同的键添加新entry
,则会替换之前的值。密钥必须是唯一的。
所以你的问题无效。
Map1 Map2
<1,2> <1,2>
<1,3> <1,4>
<2,4> <2,5>
<2,5> <2,6>
考虑你的情况,最终的地图如下。相同键的先前值将替换为新值。
Map1 Map2
<1,3> <1,4>
<2,5> <2,6>
您可以执行以下操作
Map<Integer,Integer> map1=new HashMap<>();
Map<Integer,Integer> map2=new HashMap<>();
map1.put(1,2);
map1.put(2,3);
map1.put(3,4);
map2.put(1,2);
map2.put(2,2);
map2.put(3,2);
for(Map.Entry<Integer,Integer> entry:map2.entrySet()){
if(entry.getValue().equals(map1.get(entry.getKey()))){
map1.remove(entry.getKey());
}
}
System.out.println(map1);
答案 2 :(得分:0)
现在很明显你想拥有Set
对,解决方案相当容易。首先,您必须确定要使用的对类,例如AbstractMap.SimpleEntry
或自定义书面。如果是自定义Pair
类,则必须确保具有正确的equals
和hashCode
方法实现。但是自定义Pair
类的优点是,当toString
实现具有不正确的Entry
表示时,您可以提供String
方法返回正确的对表示。因此,在我的示例中,我添加了自定义Set
到String
转换方法。
→使用Set
,您可以根据要求使用removeAll
:
public static void main(String[] args) throws InterruptedException
{
Set<Map.Entry<Integer,Integer>> set1=new HashSet<>(), set2=new HashSet<>();
put(set1, 1, 2);
put(set1, 1, 3);
put(set1, 2, 4);
put(set1, 2, 5);
put(set2, 1, 2);
put(set2, 1, 4);
put(set2, 2, 5);
put(set2, 2, 6);
System.out.println("Set1: "+printAsTuple(set1));
System.out.println("Set2: "+printAsTuple(set2));
Set<Map.Entry<Integer,Integer>> uniqueSet1=new HashSet<>(set1);
uniqueSet1.removeAll(set2);
System.out.println("Unique in Set1: "+printAsTuple(uniqueSet1));
Set<Map.Entry<Integer,Integer>> uniqueSet2=new HashSet<>(set2);
uniqueSet2.removeAll(set1);
System.out.println("Unique in Set2: "+printAsTuple(uniqueSet2));
}
private static <A,B> void put(Set<Map.Entry<A,B>> set1, A a, B b)
{
set1.add(new AbstractMap.SimpleEntry<>(a, b));
}
private static String printAsTuple(Set<Map.Entry<Integer, Integer>> set)
{
if(set.isEmpty()) return "[]";
StringBuilder sb=new StringBuilder().append("[ ");
for(Map.Entry<Integer, Integer> e:set)
sb.append('<').append(e.getKey()).append(",").append(e.getValue()).append(">, ");
sb.setLength(sb.length()-2);
return sb.append(" ]").toString();
}