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

标签 java collections set

我有一个数据对象类:

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。对于相同的两个对象。

关于POJO 类型的 Java Set 无法添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642951/

相关文章:

java - 如何使用 googletest 测试在 android 上调用 java 的 C++ 代码?

java - 在 @Application bean 中使用构造函数注入(inject)会导致循环引用

java - 在 JAVA 中设置工作不正确

java - 按对象的两个字段排序。 java

c# - ISet 如何有两个仅因返回类型而异的 Add(T item) 方法?

java - 带有列表作为单个键值的属性文件

java - 如何添加到基于 Java 中特定谓词的集合?

带双显示器的 Java 全屏 jframe

java - 使用参数指定有效的泛型类型

java - addAll() 奇怪地更新了 HashMap