【问题标题】:Keeping a SortedSet of objects based on a property基于属性保持对象的 SortedSet
【发布时间】:2012-03-21 08:46:45
【问题描述】:

我有一个对象Test,它有两个属性double xdouble y。我想将这些对象添加到SortedSet,保持集合在Test 的x 上按ASC 顺序排序。如果Test 的两个实例具有相同的 x 值,我希望它们在集合中按它们的 y 值排序。

我认为以下方法可以解决问题:

private SortedSet<Test> tests = new TreeSet<Test>(new Comparator<Test>() {

@Override
public int compare(Test o1, Test o2) {
    if (o1.getXpos() < o2.getXpos()) {
        return -1;
    }
    if (o1.getXpos() > o2.getXpos()) {
        return 1;
    }
    if (o1.getXpos() == o2.getXpos()) {
        if (o1.getYpos() < o2.getYpos()) {
            return -1;
        }
        if (o1.getYpos() > o2.getYpos()) {
            return 1;
        }
        if (o1.getYpos() == o2.getYpos()) {
            return 0;
        }
    }
    return 0;
}
});

相反,这对实际的 x 和 y 值进行排序;即

测试A:x=200,y=200,

测试B:x=200,y=400

插入tests后:

测试A:x=200,y=200,

测试B:x=400,y=200

而不是tests 中的实例。

【问题讨论】:

标签: java sorting set sortedset


【解决方案1】:

您的比较器是正确的。但是,如果将您的 Test 对象添加到集合中会更改它们的成员变量,例如,您会遇到更大的问题。 “testB:x=400,y=200”->“testB:x=200,y=400”。我猜你的问题在于你没有包含的代码(可能是一个拙劣的构造函数?)。

【讨论】:

  • 很可能是这样;看一些我现在没有写的代码。
  • 你是对的; Test 的构造函数采用 ypos,xpos.. 而不是 xpos,ypos.
【解决方案2】:

您是否尝试过使用两个以上的元素?不止一次,我只是简单地向后排序,直到后来才意识到。

【讨论】:

    【解决方案3】:

    我的猜测是,使用 == 比较 doubles 是否完全相等可能是问题所在。见What's wrong with using == to compare floats in Java?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多