【问题标题】:ArrayList sorting using collectionArrayList 使用集合排序
【发布时间】:2015-04-25 00:14:58
【问题描述】:

我知道我们使用可比较的函数对对象的ArrayList进行排序,以根据对象的某个属性进行排序。 但我总是想知道当我们直接在对象的 ArrayList 上调用 sort 时,例如:Collections.sort(arraylist); 它给出了您无法排序但实际上在打印对象时出现的错误,例如:

Instances in1=new Instances();
ArrayList  al=new ArrayList();
al.add(in1);
System.out.println(al.get(0));

你得到输出:

Instances@45a8123b

这是一个对象的id。

因此,如果我们在 ArrayList 上调用排序,那么它可以根据 id 对对象进行排序。 那么,为什么我们在对对象的 ArrayList 进行排序时会出错?

【问题讨论】:

  • 为什么要根据hashCode对对象进行排序?
  • 根据这个id排序,其实是hashcode,没有任何意义,人为什么要实现呢?
  • @Lashane 你是对的,我只是在问默认情况下你可以有这个选项。例如,如果你想根据入学日期打印学生姓名,那么你可以打印对象。这是一个模糊的例子,但类似这样。
  • @ArjunChaudhary 使用 Java 8,您可以非常轻松地完成类似的操作。例如。 students.sort(Comparator.comparing(Student::getDate));.

标签: java sorting arraylist collections


【解决方案1】:

如果您希望在不提供比较器的情况下对对象进行排序,请通过实现Comparable 接口来定义自然排序:

class Instances implements Comparable<Instances> {

    ....

    @Override
    public int compareTo(Instances other) {
        return Integer.compare(
                System.identityHashCode(this), 
                System.identityHashCode(other)
        );
    }
}

现在ArrayList&lt;Instances&gt; 可以按身份哈希码排序(但实际上这样做很荒谬)。

这样,您实际上必须刻意努力才能做到这一点。 Collections.sort 不承担可能错误的行为是正确的。如果您没有实现Comparable 并且没有提供Comparator,那么出错比只是默默地以半随机顺序对列表进行排序要好得多。

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 2012-08-27
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多