在Java中对自定义arraylist进行排序

时间:2013-03-30 01:12:10

标签: java sorting

根据this post,我尝试定义一个新的比较器来对包含自定义类的arraylist进行排序。我的代码如下:

public class mainClass{

    public class match {
    /*I defined a new class to hold some data points*/
        public int x;
        public int y;
        public int score;

        public match(){
            /*initialize values of match if needed*/
        }
    }

    public ArrayList<match> matchList=new ArrayList<match>(); //the arraylist that holds data

    /*code that fills the list with matches*/

    /*the following method is supposed to sort the matchlist. a match with higher score is bigger, and with the same score, a match with bigger x is bigger*/

    public void sortMatchlist(){
    Collections.sort(this.matchList,new Comparator<match>(){
        @Override
        public int compare(match o1, match o2) {
        if(o1.score>o2.score)   return 1;
            else if(o1.score==o2.score){
                if(o1.x>o2.x)   return 1;
                else return 0;
            }
            else    return 0;
        }
    });
}

然而,当我在main中调用sortMatchList()时,匹配列表似乎没有改变。我无法弄清楚出了什么问题。有人可以给我一些建议吗?提前致谢

2 个答案:

答案 0 :(得分:5)

这应该做的工作:

if (o1.score == o2.score) {
    return o1.x - o2.x;
} else {
    return o1.score - o2.score;
}

compare的输出不必是1,-1或0.它只需要是正数,零或负数来表示顺序。因此,我认为只返回xscore的差异就更清楚了。

另外,根据Java中的命名约定,类名应以大写字母开头,因此您的类match应命名为Match

答案 1 :(得分:3)

逻辑应该如下:

if(o1.score > o2.score) return 1;
if(o1.score < o2.score) return -1;
// Scores are equal - compare the "x"-s
if(o1.x > o2.x) return 1;
if(o1.x < o2.x) return -1;
return 0;

您当前的代码没有正确打破平局:当得分相等时返回0,但是o1.x < o2.x,使排序顺序错误。