“我想比较两者是否包含相同的值而不是列表的顺序。”
没有一个通用的相等运算符。有时您想按某些属性比较对象。典型的例子可能是比较字符串,有时“computer”等于或不等于“Computer”或“Vesterålen”等于或不等于“Vesteralen”。
在Java中,您可以重新定义对象之间的default等价关系(修改默认行为!)。
对象List 使用包含对象的默认等价关系作为默认等价关系并按顺序检查该等价关系。
以下示例仅忽略一个属性中的元素顺序:
class My {
private final List<String> xs;
private final List<Integer> ys;
My(List<String> xs, List<Integer> ys) {
this.xs = xs;
this.ys = ys;
}
public List<Integer> getYs() {
return ys;
}
public List<String> getXs() {
return xs;
}
@Override
public int hashCode() {
return xs.hashCode() + 7 * ys.hashCode();
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof My))
return false;
My o = (My) obj;
return
// ignoring order
getXs().stream().sorted().collect(toList()).equals(o.getXs().stream().sorted().collect(toList()))
// checking order
&& getYs().equals(o.getYs());
}
}
public class Callme {
public static void main(String... args) {
My m1 = new My(asList("a", "b"), asList(1, 2));
My m2 = new My(asList("b", "a"), asList(1, 2));
My m3 = new My(asList("a", "b"), asList(2, 1));
System.out.println(m1.equals(m2));
System.out.println(m1.equals(m3));
}
}
有输出
true
false
但是我无法定义您所需的等价关系,例如,如果一个列表包含的元素比另一个列表多,但也许您希望(例如,对您来说等于 {a, b, a}比{b, a})。
因此,为您的对象定义等价关系并覆盖 hashCode 和 equals。