簡體   English   中英

Java POJO 類型集無法添加元素

[英]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);

我也重寫了hashcodeequals方法來考慮子元素。

我錯過了什么?

您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM