[英]Java Set of type POJO not able to add elements
我有一個數據 object class:
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
object 之一中添加了 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);
我也重寫了hashcode
和equals
方法來考慮子元素。
我錯過了什么?
您的Comparator
與 equals 不一致。
也就是說:您為您的Set
選擇了一個Comparator
,在您的equals(Object)
方法返回false
的情況下返回0
。
您提到的問題可以通過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
。 對於相同的兩個對象。
我改變了一點你的代碼。 childSet.add
期望 object 但您發送兩個字符串。 這個解決方案對我有用。
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.