今日修一排序的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++]; } }
可以看到时用了二分插入排序算法。
那么之前的估测冒泡是错的,看来还是要跟进源码去看才知道呀!
相关推荐
Java Comparator比较器实例解析 Java Comparator是一种强大的比较器接口,通过实现Comparator接口,可以自定义比较规则,实现对对象的排序和比较。本文将详细介绍Java Comparator比较器实例解析,通过示例代码介绍...
Java8 Comparator源码演示及解析 Java8 中的 Comparator 是一个功能强大的接口,用于对集合进行排序。 Comparator 源码演示及解析是 Java 开发者的必备知识,通过本文的示例代码,大家可以对 Comparator 的使用和...
标题与描述均提到了“程序实现时间排序Comparator”,这表明文章的主题是关于如何在Java编程环境中使用`Comparator`接口来实现基于时间的排序。在Java中,`Comparator`是一个功能强大的工具,允许开发者自定义对象的...
Java 比较接口comparable与comparator区别解析 Java 语言中提供了两个比较接口: Comparable 和 Comparator,这两个接口都是用于比较对象的大小顺序的,但它们有着不同的使用场景和实现方式。在本文中,我们将详细...
如果我们想根据这个数据对`Person`对象进行排序,我们可以创建一个`Comparator`来比较`PerSal`对象,或者解析`PerSal`数据并应用到现有的`Person`对象上。 总的来说,`Comparator`接口是Java中实现自定义排序的关键...
在Java编程中,为了对自定义对象进行排序,Java提供了两种接口:`Comparable`与`Comparator`。这两种接口各有优势,适用于不同的场景。本文将深入探讨这两种接口的区别及其应用场景,帮助读者更好地理解它们的工作...
本篇内容涵盖了 Java 集合框架中 `Set`、`List` 和 `Map` 的核心概念及其实现细节,同时还包括了数组的基本用法以及多线程和 XML 解析的基础知识。这些内容对于 Java 开发者来说是非常重要的基础知识,掌握它们可以...
这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家
本压缩包“json_comparator_jar.zip”提供了一个JSON比较工具,帮助开发者在Java环境下快速对比两个JSON对象或文件的差异。 该工具的关键在于,它能够解析并理解JSON格式的数据,然后进行深度比较,找出两者之间的...
以上是对 Java 开发岗面试中常见知识点的详细解析,希望对你的面试准备有所帮助。在面试过程中,不仅要掌握理论知识,还要注重实际问题解决能力和项目经验的积累,这样才能在竞争激烈的 IT 行业中脱颖而出。
在Java编程语言中,`Comparator`接口用于自定义对象的排序规则。`String`, `number`以及`String+number`的`Comparator`排序涉及到如何按照特定逻辑比较字符串、数字以及字符串与数字组合的对象。这篇博客文章(链接...
例如,`Comparator<T>`接口允许我们创建比较特定类型对象的比较器,如`Comparator<String>`,确保比较的对象都是`String`类型。 此外,泛型还可以用于类的构造,如`ArrayList<T>`,以及方法的参数和返回类型,如`...
Java语言实践教学解析.pdf Java语言,作为世界上最流行的编程语言之一,被广泛应用于软件开发、企业级应用、移动应用(尤其是Android系统)以及大数据处理等领域。本实践教学解析旨在帮助学习者深入理解Java语言的...
6. **`java.text.SimpleDateFormat`与`java.time.format.DateTimeFormatter`**:用于格式化和解析日期和时间,SimpleDateFormat是旧版API,DateTimeFormatter是Java 8引入的新API。 7. **`java.util.Random`**:...
在Java编程中,对象数组排序是一项常见的任务,...以上就是关于“JAVA 对象数组按照多个属性进行排序”的详细解析,希望对你理解Java排序机制有所帮助。在实际开发中,灵活运用这些技巧可以提高代码的可维护性和效率。
当你需要对JSON对象数组中的特定值进行排序时,可以借助于Java的集合框架,特别是`Comparator`接口。`java_json_order.rar`这个压缩包文件包含了几个关键的Java源代码文件,它们展示了如何实现这一功能。 `jsonTest...
Java源码解析TreeMap简介 TreeMap是Java中的一种常用的排序树,实现了NavigableMap接口。下面是对TreeMap的详细介绍: 1. TreeMap的实现机制 TreeMap是基于Red-Black树的数据结构,红黑树是一种自平衡的二叉查找...
4. **日期和时间API**:Java 8中替换原有的日期和时间类,引入了java.time包,包含LocalDate、LocalTime、LocalDateTime等新类,提供更强大、更易用的时间日期处理功能,如日期运算、格式化和解析等。 5. **默认...
在Java中,可以使用Collections.sort()方法,结合自定义的Comparator来实现价格的比较和排序。 6. **文件组织**: 压缩包中的"com"文件可能包含了项目的源代码组织结构,通常在Java项目中,"com"是顶级包名,下面...