现在很明显,您想要一对 Set,解决方案相当简单。首先,您必须决定要使用什么配对类,例如AbstractMap.SimpleEntry 或自定义编写。如果是自定义 Pair 类,您必须确保具有正确的 equals 和 hashCode 方法实现。但是自定义Pair 类的优点是您可以提供一个toString 方法返回正确的对表示,而Entry 实现在使用作为对时具有不正确的String 表示。因此,在我的示例中,我添加了自定义 Set 到 String 的转换方法。
→ 使用Sets,您可以按照您的要求简单地使用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();
}