【问题标题】:Why use comparable and comparator interface为什么使用可比较和比较器接口
【发布时间】:2016-02-14 14:44:15
【问题描述】:

我最近遇到并采访了他们问我的问题。为什么在 java 中使用可比较和比较器接口对集合的元素进行排序。为什么不直接使用冒泡排序。如果是我的无知,请见谅,但还是给我一个答案。

【问题讨论】:

  • 那么,你将如何编写一个同时处理List<Integer>List<String> 的冒泡排序?您可以分别编写每一个,但从根本上说,您每次都需要比较集合的元素……而“我可以比较集合中的任何两个元素”正是接口的用途。跨度>

标签: java collections


【解决方案1】:

诸如“为什么使用ComparatorComparable 而不是冒泡排序”之类的问题?真的没有意义。这些不是彼此的替代品。任何排序算法(包括您自己编码的算法)都需要一种机制来定义对象的顺序。这就是接口的作用:提供一种定义对象排序的机制。

如果问题是“为什么要使用 JDK 内置的排序方法而不是自己编写?”那么答案可能相当明显:它节省了工作量和复杂性。

如果问题是“什么时候应该使用Comparable,什么时候应该使用Comparator?”那么我建议搜索有关该主题的优秀入门书之一。作为一个非常简单的答案,Comparable 用于定义类中对象的自然(默认)顺序,而Comparator 用于定义要传递给方法的自定义顺序。

还要注意Comparator 接口有许多非常强大的方法来定义比较。现在很少需要手动完成。例如,如果您有一个 Person 类,您可以使用如下代码对列表进行排序:

Collection.sort(personList, Comparator
    .comparingInt(Person::getAge)
    .thenComparing(Person::getSurname));

在我看来,这段代码比在类中定义compareTo 方法的旧机制更好,因为它隐藏了返回表示字段之间比较的任意整数的实现细节,并且意图非常明显。事实上,对旧方法的改进就足够了,在我自己的代码中,我倾向于完全避免自然排序,除非该类具有固有的明显顺序,可以自然地表示为两个整数之间的差异(例如,定义温度或高度的类) .

【讨论】:

  • Person类需要实现Comparable吗?
  • @gaurav 否。仅当您想为 Person 定义自然顺序而不提供自己的 Comparator 时,才需要实现可比较。在我给出的代码 sn-p 中,不需要自然排序。
【解决方案2】:

您可以使用您选择的任何排序算法,例如使用比较器进行气泡、插入、快速排序。它永远不是 Comparator 实现和排序算法之间的选择。

对于具有自然顺序的元素,例如数字,按词汇顺序排列的字符串,如果该顺序适合您,则不需要比较器。

您会为您设计的自定义对象或数据类型做什么?您将如何对两个 Car 对象、两个 Person 对象、两个复数等进行排序?这就是比较器派上用场的地方,例如您可以根据您在比较器中指定的长度、重量等对汽车进行排序。

【讨论】:

    【解决方案3】:

    我的感觉是,这是一个有点技巧的问题,旨在揭示一个人对 Java 语言中某些基本概念的了解。

    关于ComparableComparator。见this

    Comparable 接口强加了一个对象的natural ordering, 通过compareTo()方法的契约。

    Comparator 接口将对象的total ordering 强加于 一些对象集合,通过compare() 的合同 方法。

    Arrays.sort(objectArray) 方法仅适用于 实现Comparable 接口的对象,即具有自然 订购。

    Stack Post Explaining Total Order vs. Natural Order

    如果你想一想,如果任何类实现了Comparable 接口,那么它的任何对象集合都可以使用Collection.sort()Arrays.sort() 进行排序。任何对象都将根据该类中的compareTo 方法进行排序。那么,为什么要使用冒泡排序呢? Arrays.sort() 相应地使用 quicksortdual-pivot quicksortmergesorttimsort

    快速浏览Big-O Cheatsheet 会发现

    注意bubble sort 时间。您想在最坏的情况下使用bubble sort 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多