Java 这是使用比较器按标题、位置和顺序排序的正确方法吗?
以这个类为例Java 这是使用比较器按标题、位置和顺序排序的正确方法吗?,java,sorting,comparator,Java,Sorting,Comparator,以这个类为例 public class DynamicField implements Comparable<DynamicField> { String title; int position; int order; @Override public int compareTo(DynamicField o) { if(position < o.position) return -1;
public class DynamicField implements Comparable<DynamicField> {
String title;
int position;
int order;
@Override
public int compareTo(DynamicField o) {
if(position < o.position)
return -1;
if(position > o.position)
return 1;
if(order < o.order)
return -1;
if(order > o.order)
return 1;
return title.compareTo(o.title);
}
}
public类DynamicField实现可比较的{
字符串标题;
内部位置;
整数阶;
@凌驾
公共内部比较(动态字段o){
如果(位置o位置)
返回1;
如果(订单<订单)
返回-1;
如果(订单>订单)
返回1;
返回标题。比较(o.标题);
}
}
如果要按标题、位置和顺序排序,则compareTo方法正确吗?否,请尝试此代码
已更新
public class DynamicField implements Comparable<DynamicField> {
String title;
int position;
int order;
@Override
public int compareTo(DynamicField o) {
int result = title.compareTo(o.title);
if(result != 0) {}
else if(position != o.position)
result = position-o.position;
else if(order != o.order)
result = order- o.order;
return result;
}
}
public类DynamicField实现可比较的{
字符串标题;
内部位置;
整数阶;
@凌驾
公共内部比较(动态字段o){
int result=title.compareTo(o.title);
如果(结果!=0){}
否则如果(位置!=o位置)
结果=位置-o.位置;
否则如果(订单!=o.order)
结果=顺序-o.顺序;
返回结果;
}
}
不,您的比较顺序不正确。重新安排比较顺序将使其起作用:
@Override
public int compareTo(DynamicField o) {
int c = title.compareTo(o.title);
if (c != 0)
return c;
if(position < o.position)
return -1;
if(position > o.position)
return 1;
if(order < o.order)
return -1;
if(order > o.order)
return 1;
return 0;
}
@覆盖
公共内部比较(动态字段o){
int c=标题。比较(o.标题);
如果(c!=0)
返回c;
如果(位置o位置)
返回1;
如果(订单<订单)
返回-1;
如果(订单>订单)
返回1;
返回0;
}
这实际上与@org.life.java的答案相同。不过,你可能会觉得这个更可口
@Override
public int compareTo() {
int result = title.compareTo(o.title);
if (result == 0)
result = position - o.position;
if (result == 0)
result = order - o.order;
return result;
}
回答问题的正确方法是使用Junit编写一个简短的测试用例。编写的compareTo将按位置、顺序排序,然后按该顺序排序标题。如果
title.compareTo(o.title)==0
,position
和order>o.order
,该怎么办。你的方法将返回0
@Sheldon L.Cooper谢谢我错过了更新代码的场景谢谢,我会接受这个答案,因为它是最有用的readable@Shervin还应该考虑质量:-和正确性,例如避免溢出的可能性。如果位置或顺序为负值怎么办?然后呢?我想你的位置和顺序会颠倒不,这应该给你和@Sheldon的答案一样。我能看到的唯一问题是这里有一个溢出,比如说,位置接近2^31(2的幂为31),而o.position接近-2^31。但是如果位置和顺序值的范围是,例如,从-2^30到2^30,那么这是可以的。