Java 基于属性保留对象的分类集

Java 基于属性保留对象的分类集,java,sorting,set,sortedset,Java,Sorting,Set,Sortedset,我有一个对象,Test,它有两个属性,double x和double y。我想将这些对象添加到SortedSet,在Test的x上保持集合按ASC顺序排序。如果Test的两个实例具有相同的x值,我希望它们在集合中按y值排序 我认为下面的方法可以奏效: private SortedSet<Test> tests = new TreeSet<Test>(new Comparator<Test>() { @Override public int compare(T

我有一个对象,
Test
,它有两个属性,
double x
double 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;
}
});
private SortedSet tests=新树集(新比较器(){
@凌驾
公共整数比较(测试o1,测试o2){
if(o1.getXpos()o2.getXpos()){
返回1;
}
如果(o1.getXpos()==o2.getXpos()){
if(o1.getYpos()o2.getYpos()){
返回1;
}
如果(o1.getYpos()==o2.getYpos()){
返回0;
}
}
返回0;
}
});
而是对实际的x和y值进行排序;i、 e

测试a:x=200,y=200

测试b:x=200,y=400

插入
测试后

测试a:x=200,y=200

测试b:x=400,y=200


您是否尝试过使用两个以上的元素,而不是使用
测试中的实例?我不止一次简单地把事情倒过来分类,直到后来才意识到。

你试过两种以上的元素吗?我不止一次简单地将事情向后分类,直到后来才意识到。

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

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

我的猜测是,使用
=
比较
双精度的
s是否完全相等可能是个问题。参见

我的猜测是,使用
=
比较
双精度
s是否精确相等可能是一个问题。见

很可能是这样;看看我现在没有写的代码,你说得对;
Test
的构造函数采用ypos、xpos。。不是XPO,而是YPO。很可能是这样;看看我现在没有写的代码,你说得对;
Test
的构造函数采用ypos、xpos。。不是XPO,而是YPO。可以简化您的比较逻辑。您是否可以发布
测试的代码。equals
?顺便说一句,如果(o1.getXpos()==o2.getXpos())
这两个
x
值不是
也不是
,假设它们是实数,那么测试
if(o1.getXpos()==o2.getXpos())
。可以简化您的比较逻辑。您是否可以发布
测试的代码。equals
?顺便说一句,如果(o1.getXpos()==o2.getXpos())
这两个
x
值不是
也不是
,假设它们是实数,那么测试
if(o1.getXpos()==o2.getXpos())