POJO 类型的 Java 集无法添加元素



我有一个数据对象类:

public class MyDataObject {
private String value;
private String text;
private Set<MyDataObject> child;
// Getter & setters
// Constructor
public MyDataObject(final String value, final String text) {
this.value = value;
this.text = text;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyDataObject that = (MyDataObject) o;
return value.equals(that.value) &&
text.equals(that.text) &&
Objects.equals(child, that.child);
}
@Override
public int hashCode() {
return Objects.hash(value, text, child);
}
}

我正在MyDataObject对象之一中添加 2 个子元素。

说:

MyDataObject myDataObject = new MyDataObject("USA", "United States");
Set<MyDataObject> childSet = new TreeSet<>(Comparator.comparing(MyDataObject::getText));
childSet.add(new MyDataObject("NY", "Bronx"));      // This is added
childSet.add(new MyDataObject("NY", "Manhattan"));  // This is not being added, returing false.
myDataObject.setChild(childSet);

我已经覆盖了hashcodeequals方法,以考虑子元素。

我错过了什么?

您提到的问题可以通过Comparator.comparing(MyDataObject::getValue)重现。然而,比较器Comparator.comparing(MyDataObject::getText)Comparator.comparing(MyDataObject::getValue)都与equals不一致。参见 TreeSet 的 javadoc,其中提到了这一点。

final Comparator<MyDataObject> myDataObjectComparator = Comparator.comparing(MyDataObject::getValue);
final MyDataObject myDataObject1 = new MyDataObject("NY", "Bronx");
final MyDataObject myDataObject2 = new MyDataObject("NY", "Manhattan");
System.out.println(myDataObject1.equals(myDataObject2));
System.out.println(myDataObjectComparator.compare(myDataObject1, myDataObject2));

请注意,equals说对象不相等,而compareTo给出0。对于相同的两个对象。

您的Comparator与等于不一致。

也就是说:您已经为Set选择了一个Comparator,该在equals(Object)方法返回false的情况下返回0

我的代码有点改变。childSet.add期望对象,但您发送两个字符串。这种决心对我有用。

MyDataObject myDataObject = new MyDataObject("USA", "United States");
Set<MyDataObject> childSet = new TreeSet<>(Comparator.comparing(MyDataObject::getText));
MyDataObject myDataObject1 = new MyDataObject("NY", "Bronx");
MyDataObject myDataObject2 = new MyDataObject("NY", "Manhattan");
childSet.add(myDataObject1);        // This is added
childSet.add(myDataObject2);    // This is not being added, returing false.
myDataObject.setChild(childSet);
myDataObject.getChild()
.stream()
.map(child -> child.getValue() + " " + child.getText())
.forEach(System.out::println);

最新更新