【问题标题】:Java Set of type POJO not able to add elementsPOJO类型的Java集无法添加元素
【发布时间】:2020-06-29 16:48:45
【问题描述】:

我有一个数据对象类:

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 方法以考虑子元素。

我错过了什么?

【问题讨论】:

  • childSet.add("NY", "Bronx"); 这是无效的,应该是childSet.add(new MyDataObject("NY", "Bronx"))我无法重现你的问题
  • @Eklavya,很抱歉有错别字。我是手动输入的。问题已更新。
  • 我无法重现您的问题onlinegdb.com/S1jloiDC8

标签: java collections set


【解决方案1】:

你提到的问题可以被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。对于相同的两个对象。

【讨论】:

    【解决方案2】:

    您的Comparator 不是consistent with equals

    即:您为Set 选择了一个Comparator,在您的equals(Object) 方法返回false 的情况下返回0

    【讨论】:

      【解决方案3】:

      我改变了一点你的代码。 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);
      

      【讨论】:

        猜你喜欢
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多