我最近面对并采访了他们问我一个问题的地方。为什么在java中使用可比较和比较器接口来对集合的元素进行排序。为什么不直接使用冒泡排序。请原谅我,如果这是我的无知,但仍然给我一个答案。
答案 0 :(得分:3)
诸如“为什么使用Comparator
或Comparable
而不是冒泡排序?”之类的问题?真的没有意义。这些不是彼此的替代品。任何排序算法(包括您自己编码的算法)都需要一种定义对象顺序的机制。这就是接口的作用:提供一种定义对象排序的机制。
如果问题是“为什么要使用内置于JDK中的排序方法而不是编写自己的排序方法?”然后答案可能相当明显:它节省了工作量和复杂性。
如果问题是“您应该何时使用Comparable
以及何时应该使用Comparator
?”那么我建议寻找关于这个主题的优秀引物之一。作为一个非常简单的答案,Comparable
用于定义类中对象的自然(默认)排序,而Comparator
用于定义要传递给方法的自定义排序。
另请注意,Comparator
接口有许多非常强大的方法来定义比较。现在很少需要手动完成。例如,如果您有Person
类,则可以使用以下代码对列表进行排序:
Collection.sort(personList, Comparator
.comparingInt(Person::getAge)
.thenComparing(Person::getSurname));
在我看来,这个代码比在类中定义compareTo
方法的旧机制更好,因为它隐藏了返回表示字段之间比较的任意整数的实现细节,并使意图非常明显。事实上,对于旧方法的改进已经足够了,在我自己的代码中我倾向于完全避免自然排序,除非类具有固有的明显顺序,可以自然地表示为两个整数之间的差异(例如,定义温度或高度的类) 。
答案 1 :(得分:0)
我的感觉是,这是一个技巧问题,旨在揭示Java语言中某些基本概念的知识。
关于Comparable
和Comparator
的一点点。见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()
相应地使用quicksort
,dual-pivot quicksort
,mergesort
或timsort
。
快速浏览Big-O Cheatsheet显示
请注意bubble sort
时间。在最坏的情况下,您想使用bubble sort
吗?
答案 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
个对象,两个复数等等?这就是比较器派上用场的地方,例如:您可以根据您在比较器中指定的长度,重量等对汽车进行排序。