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())
。