`
crazywen2011
  • 浏览: 40173 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java Comparator 解析

    博客分类:
  • Java
阅读更多

今日修一排序的bug,发现其中是实现了比较器Comparator,之前也是一直在用,但是只是知其皮毛,今天便深究一下,翻其源码。

首先,大家都知道对于集合进行排序的时候,可以实现Comparator,则可以按我们的需求进行所需的排序。

主要的排序逻辑则是由compare来实现。

当返回-1时,表明不需要对传入参数的位置进行调换;

返回0时,表明值相等,也不需要进行调换。

返回1时,表明需要对值进行调换。

遂写一Demo进行了实验:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ComparatorTest {

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(4);
		list.add(3);
		list.add(6);
		System.out.println(list);
		Collections.sort(list, comparator_int);
		System.out.println(list);
	}

	public static Comparator<Integer> comparator_int = new Comparator<Integer>() {

		@Override
		public int compare(Integer o1, Integer o2) {
			System.out.println("o2:" + o2 + "-" + "o1:" + o1 + "=" + (o2 - o1));
			return o2 - o1;
		}
	};
}

  

 结果如下:

[1, 4, 3, 6]

o2:4-o1:1=3

o2:3-o1:1=2

o2:3-o1:4=-1

o2:6-o1:1=5

o2:6-o1:3=3

o2:6-o1:4=2

[6, 4, 3, 1]

 

如此看,排序的内部算法似乎是冒泡一样,便跟入进去查看一番!

Collections.sort() 用的也是Arrays.sort();

public static <T> void sort(List<T> list, Comparator<? super T> c) {
	Object[] a = list.toArray();
	Arrays.sort(a, (Comparator)c);
	ListIterator i = list.listIterator();
	for (int j=0; j<a.length; j++) {
	    i.next();
	    i.set(a[j]);
	}
    }

 继续跟下去:

Arrays.sort();

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

 看到正主了:mergeSort();

private static void mergeSort(Object[] src,
				  Object[] dest,
				  int low, int high, int off,
				  Comparator c) {
	int length = high - low;

	// Insertion sort on smallest arrays
	if (length < INSERTIONSORT_THRESHOLD) {
	    for (int i=low; i<high; i++)
		for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
		    swap(dest, j, j-1);
	    return;
	}

        // Recursively sort halves of dest into src
        int destLow  = low;
        int destHigh = high;
        low  += off;
        high += off;
        int mid = (low + high) >>> 1;
        mergeSort(dest, src, low, mid, -off, c);
        mergeSort(dest, src, mid, high, -off, c);

        // If list is already sorted, just copy from src to dest.  This is an
        // optimization that results in faster sorts for nearly ordered lists.
        if (c.compare(src[mid-1], src[mid]) <= 0) {
           System.arraycopy(src, low, dest, destLow, length);
           return;
        }

        // Merge sorted halves (now in src) into dest
        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }

 可以看到时用了二分插入排序算法。

那么之前的估测冒泡是错的,看来还是要跟进源码去看才知道呀!

1
1
分享到:
评论

相关推荐

    Java Comparator比较器实例解析

    Java Comparator比较器实例解析 Java Comparator是一种强大的比较器接口,通过实现Comparator接口,可以自定义比较规则,实现对对象的排序和比较。本文将详细介绍Java Comparator比较器实例解析,通过示例代码介绍...

    Java8 Comparator源码演示及解析

    Java8 Comparator源码演示及解析 Java8 中的 Comparator 是一个功能强大的接口,用于对集合进行排序。 Comparator 源码演示及解析是 Java 开发者的必备知识,通过本文的示例代码,大家可以对 Comparator 的使用和...

    程序实现时间排序Comparator

    标题与描述均提到了“程序实现时间排序Comparator”,这表明文章的主题是关于如何在Java编程环境中使用`Comparator`接口来实现基于时间的排序。在Java中,`Comparator`是一个功能强大的工具,允许开发者自定义对象的...

    Java 比较接口comparable与comparator区别解析

    Java 比较接口comparable与comparator区别解析 Java 语言中提供了两个比较接口: Comparable 和 Comparator,这两个接口都是用于比较对象的大小顺序的,但它们有着不同的使用场景和实现方式。在本文中,我们将详细...

    比较器Comparator简单用法

    如果我们想根据这个数据对`Person`对象进行排序,我们可以创建一个`Comparator`来比较`PerSal`对象,或者解析`PerSal`数据并应用到现有的`Person`对象上。 总的来说,`Comparator`接口是Java中实现自定义排序的关键...

    Comparable&Comparator区别

    在Java编程中,为了对自定义对象进行排序,Java提供了两种接口:`Comparable`与`Comparator`。这两种接口各有优势,适用于不同的场景。本文将深入探讨这两种接口的区别及其应用场景,帮助读者更好地理解它们的工作...

    java资料\、文件资料、多线程和xml解析_资料汇总

    本篇内容涵盖了 Java 集合框架中 `Set`、`List` 和 `Map` 的核心概念及其实现细节,同时还包括了数组的基本用法以及多线程和 XML 解析的基础知识。这些内容对于 Java 开发者来说是非常重要的基础知识,掌握它们可以...

    无法解析类型 java.util.Map$Entry。从必需的 .class 文件间接引用了它

    这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家

    json_comparator_jar.zip

    本压缩包“json_comparator_jar.zip”提供了一个JSON比较工具,帮助开发者在Java环境下快速对比两个JSON对象或文件的差异。 该工具的关键在于,它能够解析并理解JSON格式的数据,然后进行深度比较,找出两者之间的...

    Java开发岗面试知识点解析

    以上是对 Java 开发岗面试中常见知识点的详细解析,希望对你的面试准备有所帮助。在面试过程中,不仅要掌握理论知识,还要注重实际问题解决能力和项目经验的积累,这样才能在竞争激烈的 IT 行业中脱颖而出。

    String,number,String+number的Comparator排序

    在Java编程语言中,`Comparator`接口用于自定义对象的排序规则。`String`, `number`以及`String+number`的`Comparator`排序涉及到如何按照特定逻辑比较字符串、数字以及字符串与数字组合的对象。这篇博客文章(链接...

    java泛型解析

    例如,`Comparator&lt;T&gt;`接口允许我们创建比较特定类型对象的比较器,如`Comparator&lt;String&gt;`,确保比较的对象都是`String`类型。 此外,泛型还可以用于类的构造,如`ArrayList&lt;T&gt;`,以及方法的参数和返回类型,如`...

    Java语言实践教学解析.zip

    Java语言实践教学解析.pdf Java语言,作为世界上最流行的编程语言之一,被广泛应用于软件开发、企业级应用、移动应用(尤其是Android系统)以及大数据处理等领域。本实践教学解析旨在帮助学习者深入理解Java语言的...

    Java常用工具类大全,工作5年精心整理.zip

    6. **`java.text.SimpleDateFormat`与`java.time.format.DateTimeFormatter`**:用于格式化和解析日期和时间,SimpleDateFormat是旧版API,DateTimeFormatter是Java 8引入的新API。 7. **`java.util.Random`**:...

    JAVA 对象数组按照多个属性进行排序

    在Java编程中,对象数组排序是一项常见的任务,...以上就是关于“JAVA 对象数组按照多个属性进行排序”的详细解析,希望对你理解Java排序机制有所帮助。在实际开发中,灵活运用这些技巧可以提高代码的可维护性和效率。

    java_json_order.rar

    当你需要对JSON对象数组中的特定值进行排序时,可以借助于Java的集合框架,特别是`Comparator`接口。`java_json_order.rar`这个压缩包文件包含了几个关键的Java源代码文件,它们展示了如何实现这一功能。 `jsonTest...

    Java源码解析TreeMap简介

    Java源码解析TreeMap简介 TreeMap是Java中的一种常用的排序树,实现了NavigableMap接口。下面是对TreeMap的详细介绍: 1. TreeMap的实现机制 TreeMap是基于Red-Black树的数据结构,红黑树是一种自平衡的二叉查找...

    Java Platform SE 8

    4. **日期和时间API**:Java 8中替换原有的日期和时间类,引入了java.time包,包含LocalDate、LocalTime、LocalDateTime等新类,提供更强大、更易用的时间日期处理功能,如日期运算、格式化和解析等。 5. **默认...

    java爬取各大平台价格

    在Java中,可以使用Collections.sort()方法,结合自定义的Comparator来实现价格的比较和排序。 6. **文件组织**: 压缩包中的"com"文件可能包含了项目的源代码组织结构,通常在Java项目中,"com"是顶级包名,下面...

Global site tag (gtag.js) - Google Analytics