【问题标题】:How can the compareTo method work together with array.sort to sort an array?compareTo 方法如何与 array.sort 一起使用来对数组进行排序?
【发布时间】:2015-09-27 17:33:37
【问题描述】:

我知道 compareTo 可以返回正负和零值。

所以如果我使用

public class x implements Comparable <Object O> {/*...*/}

在里面赋值

public int compareTo(int i) {       
    if (this.intg < i) { return -1; } 
    else if (this.intg > i) { return 1; } 
    else { return 0; }
}

我能以这种方式使用 sort Array.sort(O[]objects) 吗?

我不知道array.sort()compareTo() 的联系。 它甚至不调用 compare 方法对其进行排序。 那么compareTo() 输入的真正作用是什么?使用array.sort()的时候不能调用这个方法可以传到哪里去

【问题讨论】:

    标签: java arrays sorting compareto


    【解决方案1】:

    这是Arrays.sort(Object[]) 的Javadocs:

    根据元素的自然顺序将指定的对象数组按升序排序。数组中的所有元素都必须实现 Comparable 接口。此外,数组中的所有元素必须是相互可比的(e1.compareTo(e2) 不得为数组中的任何元素e1e2 抛出ClassCastException)。

    所以排序方法确实依赖于数组元素的Comparable接口。

    【讨论】:

    • 所以你的意思是e1和e2必须在同一个类?
    • 是的,或者一个是另一个的子类。
    • @ksdawq 不一定。只要元素实现Comparable
    • @manouti 所以如果它们可能不同,我可以在哪里将 e2 传递给 compareTo 方法。当我排序时,它不会要求我调用 compareTo
    • @ksdawq 澄清一下,元素可以是不同的类型,但它们必须相互比较。对于数组中的每两个元素e1e2e1.compareTo(e2) 不得抛出类转换异常。关于您的问题,Comparable 的 type 参数指示当前可比较的类型可以与哪种类型进行比较。例如,如果您的类X 实现了Comparable&lt;X&gt;,则可以将X 的实例与X 类型的另一个实例或X 的子类进行比较。
    【解决方案2】:

    您可以使用Collections.sort 方法对对象的List 进行就地排序。第二个参数是您的 Comparator 实现。

    例子:

    List<Animal> animals = .. some ArrayList for example;
    Comparator<Animal> comparator = new Comparator<Animal>() {
        public int compare(Animal d1, Animal d2) {
            int v1 = d1.intg;
            int v2 = d2.intg;
    
            return (v1 > v2 ? 1 : (v1 == v2 ? 0 : -1));
        }
    };
    
    Collections.sort(animals, comparator);
    
    // the 'animals' collection is now sorted based on the `intg` property
    

    【讨论】:

    • 但我只能使用可比较的接口。你能在类似的界面中解释一下吗?谢谢
    • Comparable 的 javadocs 很好,你能解释一下你不明白的地方吗?
    • @blm 我不明白当我使用 Array.sort 时它从不要求我调用 compareTo 时,我怎么能在 compareTo() 中传递参数
    • 首先,它是 Arrays.sort(我假设。如果它真的是 Array.sort,你必须告诉我们它是什么类,因为它不是标准的 Java 类)。细节很重要。其次,您不调用 compareTo,Arrays.sort 调用。它在它正在比较的一个对象上调用 compareTo,并将它正在比较的另一个对象传递给 compareTo。所以在 Arrays.sort 的某个地方有类似 e1.compareTo(e2) 的东西。您需要让您的 compareTo 方法返回适当的值。
    【解决方案3】:

    通常,您最好创建一个比较器而不是实现 Comparable。然后,您可以将其传递给 Collections 排序方法:

    Collections.sort(myArrayList, new Comparator<MyObject>(){
         public int compare(MyObject o1, MyObject o2){
             return Integer.compare(o1.value == o2.value);
         }
    });
    

    编辑:

    在阅读了一些 OPs cmets 之后,我们可以证明 compareTo 方法确实被调用了:

    public class TestClass implements Comparable<TestClass> {
        private int value;
    
        public int getValue(){
            return this.value;
        }
    
        public void setValue(int v){
            this.value = v;
        }
    
        @Override
        public int compareTo(TestClass arg) {
            System.out.println("In compareTo");
            return Integer.compare(this.value, arg.value);
        }
    }
    

    如果我们然后执行以下操作:

        ArrayList<TestClass> a = new ArrayList<>();
        for( int i = 0; i < 10; i++ ){
            TestClass t = new TestClass();
            t.setValue(i);
            a.add(t);
        }
    
        System.out.println("Before sort.");
        Collections.sort(a);
    

    我们将看到在 sort 方法中调用 compareTo 方法,因为终端将显示我们的跟踪语句:

    Before sort.
    In compareTo
    In compareTo
    In compareTo
    In compareTo
    In compareTo
    In compareTo
    In compareTo
    In compareTo
    In compareTo
    

    【讨论】:

    • 你能解释一下“你最好创建一个 Comparator 而不是实现 Comparable”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2018-08-26
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多