Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
POJO类型的Java集无法添加元素_Java_Collections_Set - Fatal编程技术网

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

POJO类型的Java集无法添加元素,java,collections,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

我有一个数据对象类:

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);
  }
}
我已经重写<代码> hash码和<代码>等于方法,以及考虑子元素。


我遗漏了什么?

我对您的代码做了一些更改
childSet。添加
expect对象,但发送两个字符串。这个决心对我有用

    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);
MyDataObject MyDataObject=新的MyDataObject(“美国”、“美国”);
Set childSet=newtreeset(Comparator.comparing(MyDataObject::getText));
MyDataObject myDataObject1=新的MyDataObject(“纽约”、“布朗克斯”);
MyDataObject myDataObject2=新的MyDataObject(“纽约”、“曼哈顿”);
添加(myDataObject1);//这是增加的
childSet.add(myDataObject2);//未添加此项,返回false。
myDataObject.setChild(childSet);
myDataObject.getChild()
.stream()
.map(child->child.getValue()+“”+child.getText())
.forEach(System.out::println);

您的
比较器不可用


也就是说:您为
集合选择了一个
比较器
,当
等于(对象)
方法返回
false
时,该比较器返回
0
,您提到的问题可以通过
比较器重现。比较(MyDataObject::getValue)
。然而,比较器
Comparator.comparing(MyDataObject::getText)
Comparator.comparing(MyDataObject::getValue)
equals不一致。请参阅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));
final Comparator myDataObjectComparator=Comparator.comparating(MyDataObject::getValue);
最终MyDataObject myDataObject1=新的MyDataObject(“纽约”、“布朗克斯”);
最终MyDataObject myDataObject2=新的MyDataObject(“纽约”、“曼哈顿”);
System.out.println(myDataObject1.equals(myDataObject2));
System.out.println(myDataObjectComparator.compare(myDataObject1,myDataObject2));

请注意,
equals
表示对象不相等,而
compareTo
表示
0
。对于相同的两个对象。

childSet.add(“NY”、“Bronx”)这是无效的,应该是
子集。添加(新的MyDataObject(“NY”,“Bronx”))
我无法复制您issue@Eklavya,对不起,我打错了。我是手工打字的。问题更新。我无法复制您的问题
    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));