我是一名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 ...”
我真的不知道发生了什么,非常感谢任何帮助。
答案 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));
}