Java中自定义排序的最佳方式?

时间:2012-02-26 03:22:34

标签: java sorting

我是一名C ++程序员,目前我正在使用Java(我确实有相当多的java经验)。

基本上,我想重新创建我在C ++中常用的pair<int,int>,我想让它按第二个整数值排序。

我正在网上搜索并尝试不同的方式,包括使用Comparator,Comparable等。

我基本上是在创建一个如下所示的测试程序:

import java.math.*;
import java.util.*;
import java.io.*;
import java.text.*;

class PairTest
{

    public static void main (String args[])  // entry point from OS
    {
        new PairTest().run();


    }

    public void run (){
        Pair foo = new Pair(1,2);
        System.out.println(foo.first + " "+ foo.second);
        ArrayList <Pair> al = new ArrayList<Pair>();
        for(int i =10;i>0;i--){
            al.add(new Pair(i, i*2));
        }
        for(int i =0;i<al.size();i++){
            System.out.println(al.get(i).first + " " + al.get(i).second);
        }
        Collections.sort(al);
        for(int i =0;i<al.size();i++){
            System.out.println(al.get(i).first + " " + al.get(i).second);
        }
    }

    private class Pair implements Comparable{

        public int first;
        public int second;

        public Pair (int a, int b){
            this.first = a;
            this.second = b;

        }

        int compareTo (Pair o){
            return new Integer(this.second).compareTo(new Integer(o.second));
        }
    }

}

制作自定义排序功能的最佳方法是什么,以便ArrayList按“第二”变量排序。我想要一种快速而安全的方法,目前,编译器告诉我“PairTest.Pair不会覆盖抽象方法compareTo ...”

我真的不知道发生了什么,非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

您的Pair类存在两个问题:它没有声明通用参数,compareTo方法需要public。此外,返回int值之间的差异比构造Integer对象并调用compareTo更有效。试试这个:

private class Pair implements Comparable<Pair> {

    public int first;
    public int second;

    public Pair (int a, int b){
        this.first = a;
        this.second = b;

    }

    public int compareTo (Pair o){
        return second < o.second ? -1 : (second == o.second ? 0 : 1);
    }
}

答案 1 :(得分:2)

在您的代码中,您应该更改:

private class Pair implements Comparable

private class Pair implements Comparable<Pair>

你改变了这一行:

int compareTo (Pair o)

public int compareTo (Pair o)

因为此函数将在此类之外使用:)

这就是你所需要的:)

答案 2 :(得分:1)

覆盖comapreTo课程中的Pair方法。无需实施任何内容。

comapreTo方法接受Object作为参数

public int compareTo(Object another)
{
    return new Integer(this.second).compareTo(new Integer(((Pair)another).second));
}