我是一名java新手,我正在尝试理解here给出的代码。
我无法理解的是,在该类StringLengthComparator中,它们构成了比较2个对象的“骨架”:String o1,String o2。
然而,当他们应用该类时,有6个字符串被传递给StringLengthComparator并产生正确的结果。
我的问题是在类中只比较了2个对象,但是当传递6个字符串时会产生正确的结果吗?
显然,我在这里缺少一些基本的东西,因此,对此的任何指导都会很棒。
答案 0 :(得分:2)
比较器(用于java中的集合),用于指定排序参数,如长度或字母顺序等。默认情况下,它按字母顺序比较字符串,所以如果你想比较两个字符串的长度,那么它将通过覆盖比较器来比较它。
Arrays.sort(strs, new StringLengthComparator());
将为数组strs中的每个元素排序字符串数组,并指定比较器StringLengthComparator
,该比较器参数将是字符串的长度。
答案 1 :(得分:1)
Java的内部排序算法(或任何排序算法)需要知道如何对基元以外的对象进行排序。
例如,java知道如何对integers
数组进行排序,因为它具有已建立的自然顺序。 [对于任何整数序列(a,b)a将出现在b之前,如果a小于b]
对于可由用户创建的所有对象,情况并非如此。因此,对于这些对象,我们应该让java知道如何排序,Comparator.compare()
用于此目的。
由于任何排序算法都需要知道如何仅比较相同类型的two
个对象,因此Comparator.compare()
答案 2 :(得分:1)
当您创建类似StringLengthComparator
, 之类的内容时,开发人员会实现:
int compare(T o1, T o2)
方法作为实现Comparator
接口的合同的一部分。遇到任意两个T
对象时,此方法会返回1
,0
或-1
,具体取决于o1
是否大于,等于或小于分别为o2
。
如果正确实现,这是任何排序算法通常插入代码的唯一要求,无论是mergesort
,quicksort
还是其他任何排序例程你能想到的。
Arrays
类在您调用时使用此属性:
static void sort(Object[] a, Comparator c)
如果您有任何疑问,请下载JDK源代码,看看它是如何完成的。作为练习,您应该编写类似于BubbleSort
算法的算法,该算法使用比较器并使用它对数组进行排序。
答案 3 :(得分:1)
我的问题是在类中只比较了2个对象,但是当传递6个字符串时会产生正确的结果吗?
对象的.compare
方法一次比较两个字符串 。 Arrays.sort
方法在提供的对象上多次调用.compare
,从整套6中传递不同的字符串对,使用结果信息对数组进行排序。 / p>
答案 4 :(得分:0)
我看到你的困惑。它不是一个“骨架”,它只是用于确定一件事与另一件事之间关系的算法。因此,当需要确定这种关系时,排序会调用比较器。例如,您可以通过在比较器中向后设置关系来获得降序排序。
答案 5 :(得分:0)
基本上,字符串数组(6个字符串)不传递给StringLengthComparator,而是传递给Arrays.sort,后者使用StringLengthComparator逐个比较字符串并对数组进行排序
答案 6 :(得分:0)
最终,这就是Arrays.sort
的实施方式。您可以look at the Java 6 API,但在您自己查看source code之前,您不会对此感到满意 - 请检查文件/jdk/src/share/classes/java/util/Arrays.java in源代码目录。
这个方法正在做的是接受一个数组,然后是比较器,然后使用该Comparator在整个数组上运行合并排序的版本。如果你研究mergesort以完全掌握这种方法的本质,那么你会得到很好的服务。
这是代码的片段,因为Java 6/7是开源的。再次,看看mergesort,你将能够看到它为什么会这样运作。
public static <T> void sort(T[] a, Comparator<? super T> c) {
T[] aux = (T[])a.clone();
if (c==null)
mergeSort(aux, a, 0, a.length, 0);
else
mergeSort(aux, a, 0, a.length, 0, c);
}