2012-02-26 73 views
1

我是一名C++程序员,现在我正在使用Java(我确实拥有大量的Java经验)。在Java中自定义排序的最佳方式是什么?

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

我在互联网上搜索,并尝试的要对此,使用比较包括不同的方式,可比等

我基本上是创建一个测试程序,它看起来像这样:

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

是的,我想,用适当的铸造,但我的程序给我打电话Collections.sort麻烦时(); – 2012-02-26 03:30:39

+0

而不是一个列表中的排序对,一个常见的模式是使用一个地图,只要这些值是唯一的(即使没有,也有解决方案),例如尝试'TreeMap '你正在排序的值是关键。 – 2012-02-26 07:55:46

回答

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); 
    } 
} 
+0

不错,那就是诀窍! (看起来Comparable 是造成大部分问题的原因) – 2012-02-26 03:31:07

+1

不是再次破解..给定的compareTo版本是正确的,但这不是。例如2 ** 30当然大于-2 ** 30。我的一位教授曾经说过,“如果它不一定是正确的,我可以任意快速地使它......” – Voo 2012-02-26 03:43:54

+0

@Voo - 好点。我更新了代码以避免溢出问题;现在在所有情况下都应该是正确的。尽管原始的compareTo是正确的,但效率非常低下 - 每次比较都需要两个Integer对象。 – 2012-02-26 06:31:15

2

在你的代码,你应该改变:

private class Pair implements Comparable 

private class Pair implements Comparable<Pair> 

你改变这一行:

int compareTo (Pair o) 

public int compareTo (Pair o) 

,因为这个功能将是这个类的境外使用:)

这就是你需要:)

+0

+1简洁而简洁,但有人已经通过给我一个关于程序应该如何的样子的例子来打败你:) – 2012-02-26 03:32:36

1

覆盖comapreToPair类方法。无需执行任何操作。

comapreTo方法接受Object作为参数

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