Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是使用比较器按标题、位置和顺序排序的正确方法吗?_Java_Sorting_Comparator - Fatal编程技术网

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,那么这是可以的。