Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中自定义排序的最佳方法? 我是一个C++程序员,我现在使用java,我有相当多的java经验。 基本上,我想重建我在C++中常用的一对,我想让它按第二个整数值排序。_Java_Sorting - Fatal编程技术网

Java中自定义排序的最佳方法? 我是一个C++程序员,我现在使用java,我有相当多的java经验。 基本上,我想重建我在C++中常用的一对,我想让它按第二个整数值排序。

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

我在互联网上搜索并尝试不同的方法,包括使用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


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

您的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表示简短,但有人已经通过给我一个关于程序应该是什么样子的示例击败了你: