为何使用可比较和比较器接口

时间:2015-11-13 03:49:47

标签: java collections

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

3 个答案:

答案 0 :(得分:3)

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

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

如果问题是“您应该何时使用Comparable以及何时应该使用Comparator?”那么我建议寻找关于这个主题的优秀引物之一。作为一个非常简单的答案,Comparable用于定义类中对象的自然(默认)排序,而Comparator用于定义要传递给方法的自定义排序。

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

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

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

答案 1 :(得分:0)

我的感觉是,这是一个技巧问题,旨在揭示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显示 enter image description here

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

enter image description here

答案 2 :(得分:0)

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

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

您会为自己设计的自定义对象或数据类型做些什么?你会如何排序两个Footnote-sign { background-color: #ffc; cursor: pointer; vertical-align: super; font-size: 77%; z-index: 100; /* a large number to ensure it's on top */ } Footnote-tooltip { background-color: #fea; border: 1px solid #6b0000; display: inline; padding: 5px; display: none; position: absolute; font-size: 85%; max-width: 540px; text-align: left; z-index: 100; /* a large number to ensure it's on top */ } 个对象,两个Car个对象,两个复数等等?这就是比较器派上用场的地方,例如:您可以根据您在比较器中指定的长度,重量等对汽车进行排序。