如何用Java减去两个地图?

时间:2013-11-20 08:55:00

标签: java map

我有两个地图集合,比如说, 将值视为整数列表。 即,对于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?)是实现这个目标的最佳方式?

我是初学者如果你可以指导我正确的方向而不是投票,那就太棒了。

3 个答案:

答案 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类,则必须确保具有正确的equalshashCode方法实现。但是自定义Pair类的优点是,当toString实现具有不正确的Entry表示时,您可以提供String方法返回正确的对表示。因此,在我的示例中,我添加了自定义SetString转换方法。

→使用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();
}