Java树集与比较器.如何与不独特的价值观工作?



我试图了解如何与比较器实现的TreeSet一起工作。代码如下:

数字集合中的对象应按照以下规则排序:

  • 如果一个范围比其他范围长,那么它在排序顺序中是较大的。
  • 如果多个range长度相同,则较小的为左边框较小的。
  • 按升序排序。

* range的左边框总是小于右边框,但它们的值也可以是负值。

问题是TreeSet只能包含唯一的值,所以当前代码在结果输出中切割了一些具有相同范围的对象。因此,我似乎需要在compare ()中添加一个附加条件,但我不知道到底应该有什么条件。我相信这里有一种方法可以只更改getComparator()方法。

import java.util.*;
class LongRange {
public static void main(String[] args) {
Set<LongRange> numbers = new TreeSet<>(LongRange.getComparator());
numbers.add(new LongRange(0, 5));
numbers.add(new LongRange(2, 4));
numbers.add(new LongRange(1, 4));
numbers.add(new LongRange(1, 7));
numbers.add(new LongRange(3, 5));
numbers.add(new LongRange(-10, 1));
numbers.add(new LongRange(-20, -9));
numbers.add(new LongRange(-21, -10));
numbers.forEach(System.out::println);
}
private final long left;
private final long right;
public static Comparator<LongRange> getComparator() {
return Comparator.comparing(a -> Math.subtractExact(a.right, a.left));
}
public LongRange(long left, long right) {
this.left = left;
this.right = right;
}
public long getLeft() {
return left;
}
public long getRight() {
return right;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (other == null || getClass() != other.getClass()) {
return false;
}
LongRange longRange = (LongRange) other;
return left == longRange.left &&
right == longRange.right;
}
@Override
public int hashCode() {
return Objects.hash(left, right);
}
@Override
public String toString() {
return String.format("%d %d", left, right);
}
}

总结Ole V.V.的评论并将其应用于我的案例,解决方案如下。在这种情况下,对我来说棘手的事情是我需要声明a显式地-(LongRange a).

public static Comparator<LongRange> getComparator() {
return Comparator.comparingLong((LongRange a) -> a.right- a.left)
.thenComparingLong((LongRange a) -> a.left);
}