在java中实现比较器

时间:2011-12-26 06:39:08

标签: java comparator

我是一名java新手,我正在尝试理解here给出的代码。

我无法理解的是,在该类StringLengthComparator中,它们构成了比较2个对象的“骨架”:String o1,String o2。

然而,当他们应用该类时,有6个字符串被传递给StringLengthComparator并产生正确的结果。

我的问题是在类中只比较了2个对象,但是当传递6个字符串时会产生正确的结果吗?

显然,我在这里缺少一些基本的东西,因此,对此的任何指导都会很棒。

7 个答案:

答案 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对象时,此方法会返回10-1,具体取决于o1是否大于,等于或小于分别为o2

如果正确实现,这是任何排序算法通常插入代码的唯一要求,无论是mergesortquicksort还是其他任何排序例程你能想到的。

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);
}