【问题标题】:Collections.Sort an ArrayList in javaCollections.Sort 在java中的ArrayList
【发布时间】:2013-08-25 14:05:33
【问题描述】:

我在java中使用这个函数:

Collections.sort(an Arraylist, new CustomComparator);

CustomComparator 类中的 compare 方法将返回一个 int。这对排序过程意味着什么?这个值的数量是多少?如何影响排序过程?

更具体地说,我希望在比较方法中比较两个值。这是我的代码:

    import java.util.Comparator;

    public abstract class CustomComparator implements Comparator<HLine> {
        @Override
        public int compare(HLine hl1, HLine hl2) {
            return hl1.y < hl2.y;
        }
    } 

我要求排序:

    Collections.sort(hlines, new comparator());

hlines 是一个包含一个 Point 和两个双精度对象的 Arraylist。我想比较两个对象中的第二个双精度。

【问题讨论】:

标签: java sorting compare return


【解决方案1】:

基本上,正如Comparator.compareComparable.compareTo 的Javadoc 中所述,这些方法返回

作为第一个参数的负整数、零或正整数小于、等于或大于第二个参数。

意思是如果你打电话

new Integer(1).compareTo(0)

它会返回一个负整数,表示0必须排在1之前。

new Integer(1).compareTo(1)

它将返回 0,这表示两个值必须在同一级别上排序。

new Integer(1).compareTo(2)

返回一个正整数,表示2必须排在1之后。

要修复您的代码示例,您需要重写 compare(),使其返回 Integer,因为它现在返回 boolean,并且无法编译。

因为您正在尝试比较doubles,您可以简单地更改为

    @Override
    public int compare(HLine hl1, HLine hl2) {
        return hl1.y - hl2.y;
    }

【讨论】:

    【解决方案2】:

    sort() 方法对元素进行排序,但首先将它们进行比较。为了进行比较,sort() 方法可以使用 compare() 或 compareTo() 方法。

    现在,如果你想只根据一个属性对元素进行排序,请使用可比较接口的 compareTo() 方法。

    如果要根据多个元素对元素进行排序,则使用比较器接口的 cmopare() 方法。

    【讨论】:

    • -1,因为 compareTo() 和 compare() 都不会限制比较中使用的属性数量。唯一的区别是,Comparable 需要在应该比较的类中实现。如果您使用 Comparator,则该类本身不需要实现 Comparable,如果您有多个不同的比较,它会很有用。
    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2020-01-16
    • 2014-10-13
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多