使用自己的比较器从TreeSet中删除元素,并在TreeSet中自动排序

时间:2019-05-15 20:27:03

标签: java comparator treeset

我有一个A类,其实例具有8个属性,后两个属性为“ int”类型。我已经实现了Comparator接口,必须根据7.属性比较元素。如果7.属性的值相等,则必须另外通过8.属性比较对象,这些值不能相等。我在另一个类的构造函数中使用此比较器构建了一个TreeSet。使用此TreeSet进行操作时,我遇到了意外的行为。

compare()实现如下:

// class AComparator

public int compare(A a1, A a2) {
  int result = a1.get7attriibute() - a2.get7attribute();
  if (result == 0) {
    return a1.get8attribute() - a2.get8attribute();
  } else {
    return result;
  }
}

TreeSet初始化如下:

TreeSet<A> ts = new TreeSet<A>(new AComparator());

稍后在代码中,我使用以下BiFunction:

BiFunction<A,A,A> funName = (v,u) -> {
  return v.get8attribute() > u.get8Attribute() ? v : u;
}

函数用法如下:

A result = funName.apply(a1,a2); // where a1 and a2 from the TreeSet

使用

ts.remove(result);

稍后在代码中,我希望程序从TreeSet中删除结果。但是,在调试器中,我看到结果具有与a1和a2不同的ID,因此所有a1,a2和result-都是三个不同的对象。为什么? 深入调试器我看到在这一行“ ts.remove(result)”,调试器跳入了已实现的AComparator。为什么,为什么呢?在这一点上,我无法理解我的实现是否损坏,或者无法解释为什么不从集合中删除该元素,并且程序会跳转到我的AComparator。

第二点-如果更改已经存在的元素的7.属性值,TreeSet的元素是否保持排序?我注意到添加的元素将与排序放在一起,但是我没有提到更改7.属性的值会影响元素在TreeSet中的位置,因此TreeSet似乎不再是排序集。我可能会犯错,但不幸的是,由于程序的复杂性,我无法跟踪这一点。

谢谢。

0 个答案:

没有答案