Java中自定义排序的最佳方法? 我是一个C++程序员,我现在使用java,我有相当多的java经验。 基本上,我想重建我在C++中常用的一对,我想让它按第二个整数值排序。
我在互联网上搜索并尝试不同的方法,包括使用Comparator、Comparable等 我基本上是在创建一个如下所示的测试程序:Java中自定义排序的最佳方法? 我是一个C++程序员,我现在使用java,我有相当多的java经验。 基本上,我想重建我在C++中常用的一对,我想让它按第二个整数值排序。,java,sorting,Java,Sorting,我在互联网上搜索并尝试不同的方法,包括使用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 Pa
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
我真的不知道发生了什么,非常感谢您的帮助。您的Pair类有两个问题:它没有声明泛型参数,compareTo方法需要公开。此外,只返回int值之间的差值比构造整数对象并调用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);
}
}
Pair类有两个问题:它没有声明泛型参数,并且compareTo方法需要是公共的。此外,只返回int值之间的差值比构造整数对象并调用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);
}
}
在代码中,您应该更改:
private class Pair implements Comparable
到
到
因为此函数将在此类之外使用:
这就是您所需要的:在代码中,您应该更改:
private class Pair implements Comparable
到
到
因为此函数将在此类之外使用:
这就是您所需要的:在结对类中重写comapreTo方法。不需要实现任何东西
comapreTo方法接受对象作为参数
public int compareTo(Object another)
{
return new Integer(this.second).compareTo(new Integer(((Pair)another).second));
}
在Pair类中重写comapreTo方法。不需要实现任何东西
comapreTo方法接受对象作为参数
public int compareTo(Object another)
{
return new Integer(this.second).compareTo(new Integer(((Pair)another).second));
}
是的,我尝试了适当的铸造,但我的程序给我带来了麻烦,当调用Collections.sort;与列表中的排序对不同,一种常见的模式是使用映射,只要值是唯一的,即使不是唯一的,也有解决方案。例如,尝试树映射,其中您正在排序的值是关键。是的,我尝试了适当的强制转换,但我的程序在调用Collections.sort时给我带来了麻烦;与列表中的排序对不同,一种常见的模式是使用映射,只要值是唯一的,即使不是唯一的,也有解决方案。例如,尝试树映射,其中您要排序的值是键。很好,这就成功了!似乎大部分问题都是由可比性引起的,而不是再次发生的黑客行为。。给定的compareTo版本正确,但此版本不正确。例如,230肯定大于-230。我的一个prof曾经说过,如果它不一定是正确的,我可以任意地使它变快。@Voo-好的观点。我更新了代码以避免溢出问题;现在,它在所有情况下都应该是正确的。虽然最初的compareTo是正确的,但每次比较都需要两个Integer对象是非常低效的。@Ted Perfect+1请注意,Integer.compare是最好的解决方案。但他们实现的结果与您的解决方案完全相同。@Voo-Integer.compare的优点;这是最具可读性的解决方案。然而,它在Java7之前并不存在,并且不是每个人都在使用最新的Java。很好,这就成功了!似乎大部分问题都是由可比性引起的,而不是再次发生的黑客行为。。给定的compareTo版本正确,但此版本不正确。例如,230肯定大于-230。我的一个prof曾经说过,如果它不一定是正确的,我可以任意地使它变快。@Voo-好的观点。我更新了代码以避免溢出问题;现在,它在所有情况下都应该是正确的。虽然最初的compareTo是正确的,但每次比较都需要两个Integer对象是非常低效的。@Ted Perfect+1请注意,Integer.compare是最好的解决方案。但他们实现的结果与您的解决方案完全相同。@Voo-Integer.compare的优点;这是最具可读性的解决方案。然而,它在Java 7之前并不存在,并且不是每个人都在使用最新的Java。+1表示简短,但有人已经通过给我一个关于程序应该是什么样子的示例击败了你:+1表示简短,但有人已经通过给我一个关于程序应该是什么样子的示例击败了你: