我有两个排序集:sortedSet1(Object ,Object1 , Object2 , Object3 , Object4 )
和sortedSet2(Object ,Object1 , Object2 , Object3 , Object4 )
。这些对象还有其他包含对象的列表。
我想从内到外比较每个值,并捕获2个sortedSet之间的任何差异。我不希望有确切的区别。我想看看是否有任何变化。我已经尝试过sortedSet1.equals(sortedSet2)
,但是它死了,如果我在sortedSet内的另一个对象内更改一个值,它不会引起任何区别。我也尝试过
if (!sortedSet1.containsAll(sortedSet2)) {
// do something
}
没有运气。.我认为答案存在于流中,但是我对它们的经验很少。
非常感谢您的帮助。
答案 0 :(得分:1)
如果我在sortedSet内的另一个对象内更改值,则无法捕捉到差异
首先发现差异将是这样的:
SortedSet<Object> common = new TreeSet<>(sortedSet1);
common.retainAll(sortedSet2);
SortedSet<Object> all = new TreeSet<>(sortedSet1);
all.addAll(sortedSet2);
SortedSet<Object> differences = new TreeSet<>(all);
differences.removeAll(common);
但是一旦您提及更改对象,它就会发出警报。
永远不要更改一个值,以使其使用的键(hashCode或此处Comparable)更改。这样,顺序和结构位置就会损坏。对于树形结构,由于假定左子树小于节点的键,所以树的部分无法访问,而右子树的节点应大于节点的键。