文档章节

深入了解Arrays.sort()

奋斗到天明
 奋斗到天明
发布于 2015/08/27 17:39
字数 852
阅读 40
收藏 0

Arrays.sort(T[], Comparator<? super T> c) 是一个用于用户自定义排序对象的方法,在离线的JavaDoc中简单地描述了他怎么工作,但是没有更深入的解释,在这篇文章中,我们将讨论深入了解这个方法的关键信息。

1.怎么使用Arrays.sort():一个简单的例子。

通过读下面的例子,你将快速地知道如何正确的使用这个方法,一个Comparator被定义比较狗的尺寸,Comparator被用作排序方法的参数。

import java.util.Arrays;
import java.util.Comparator;
 
class Dog{
  int size;  
  public Dog(int s){
    size = s;
  }
}
 
class DogSizeComparator implements Comparator{
 
  @Override
  public int compare(Dog o1, Dog o2) {
    return o1.size - o2.size;
  }
}
 
public class ArraySort {
 
  public static void main(String[] args) {
    Dog d1 = new Dog(2);
    Dog d2 = new Dog(1);
    Dog d3 = new Dog(3);
 
    Dog[] dogArray = {d1, d2, d3};
    printDogs(dogArray);
 
    Arrays.sort(dogArray, new DogSizeComparator());  
    printDogs(dogArray);
  }
 
  public static void printDogs(Dog[] dogs){
    for(Dog d: dogs)
      System.out.print(d.size + " " );
 
    System.out.println();
  }
}

输出:

2 1 3
1 2 3

2. Arrays.sort()使用的策略模式

这是一个完美的策略模式例子,这里值得注意为什么 策略模式有这个场景中是好的。简单来说,策略模式允许在运行时选择不同的算法,在这个用例中,通过解析不同的Comparator能选中不同的算法。基于上面的例子,假设你可以有其他的Comparator,能比较够的重量,你可以简单的创建一个新的Comparator,如下:

class Dog{
  int size;
  int weight;
 
  public Dog(int s, int w){
    size = s;
    weight = w; 
  }
}
 
class DogSizeComparator implements Comparator{
 
  @Override
  public int compare(Dog o1, Dog o2) {
    return o1.size - o2.size;
  }
}
 
class DogWeightComparator implements Comparator{
 
  @Override
  public int compare(Dog o1, Dog o2) {
    return o1.weight - o2.weight;
  }
}
 
public class ArraySort {
 
  public static void main(String[] args) {
    Dog d1 = new Dog(2, 50);
    Dog d2 = new Dog(1, 30);
    Dog d3 = new Dog(3, 40);
 
    Dog[] dogArray = {d1, d2, d3};
    printDogs(dogArray);
 
    Arrays.sort(dogArray, new DogSizeComparator());  
    printDogs(dogArray);
 
    Arrays.sort(dogArray, new DogWeightComparator());  
    printDogs(dogArray);
  }
 
  public static void printDogs(Dog[] dogs){
    for(Dog d: dogs)
      System.out.print("size="+d.size + " weight=" + d.weight + " ");
 
    System.out.println();
  }
}
size=2 weight=50 size=1 weight=30 size=3 weight=40 
size=1 weight=30 size=2 weight=50 size=3 weight=40 
size=1 weight=30 size=3 weight=40 size=2 weight=50

Comparator只是一个接口,任何Comparator实现了这个接口都能在运行时中使用,这就是策略设计模式的关键意图。

为什么用 super!

这十分简单,如果Comparator < T > c是参数,但是第二个参数Comparator< ? super T > c”. < ? super T >意味着类型可能是T或者他的超类,为什么允许超类?答案是:这样允许同样的比较器对应服务所有的之类,下面是一个十分明显的例子。

import java.util.Arrays;
import java.util.Comparator;
 
class Animal{
  int size;
}
 
class Dog extends Animal{
  public Dog(int s){
    size = s;
  }
}
 
class Cat extends Animal{
  public Cat(int s){
    size  = s;
  }
}
 
class AnimalSizeComparator implements Comparator{
 
  @Override
  public int compare(Animal o1, Animal o2) {
    return o1.size - o2.size;
  }
  //in this way, all sub classes of Animal can use this comparator.
}
 
public class ArraySort {
 
  public static void main(String[] args) {
    Dog d1 = new Dog(2);
    Dog d2 = new Dog(1);
    Dog d3 = new Dog(3);
 
    Dog[] dogArray = {d1, d2, d3};
    printDogs(dogArray);
 
    Arrays.sort(dogArray, new AnimalSizeComparator());  
    printDogs(dogArray);
 
    System.out.println();
 
    //when you have an array of Cat, same Comparator can be used. 
    Cat c1 = new Cat(2);
    Cat c2 = new Cat(1);
    Cat c3 = new Cat(3);
 
    Cat[] catArray = {c1, c2, c3};
    printDogs(catArray);
 
    Arrays.sort(catArray, new AnimalSizeComparator());  
    printDogs(catArray);
  }
 
  public static void printDogs(Animal[] animals){
    for(Animal a: animals)
      System.out.print("size="+a.size + " ");
    System.out.println();
  }
}
size=2 size=1 size=3 
size=1 size=2 size=3 

size=2 size=1 size=3 
size=1 size=2 size=3

总结 

总的来说,Array.sort()表达的 

1、泛型 - super 

2、策略模式 

3、归并排序 -nlog(n)的时间复杂度 

4.Java.util.Collections#sort(List < T > list, Comparator < ? super T > c) 有相似的想法。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
Arrays.sort()你应该知道的事

Arrays.sort(T[], Comparator < ? super T > c) 是用来对用户自定义的对象数组排序功能的。Java 官方文档简单描述了它的作用,但不足以让我们深刻理解。为了更深入地理解它,这篇文章将梳理相...

LCZ777
2014/03/31
0
0
JDK提供的排序算法是怎么实现的?

前几天整理的一套面试题,其中有一个问题就是Java的JDK中我们见到的Collections.sort()和Arrays.sort()这两个排序算法的实现方式是什么,很多小伙伴心里边默认的应该是快排,但是不全对或者理...

HOT_POT
07/29
0
0
455. Assign Cookies - LeetCode

Question 455. Assign Cookies Solution 题目大意:数组g的大小表示有几个小孩,每个元素表示小孩的食量,数组s的大小表示有多少个饼干,每个元素的大小表示每个饼干的大小,把饼干分给小孩,每个小...

yysue
07/05
0
0
加热器的加热半径 Heaters--页面一直有错

问题: Winter is coming! Your first job during the contest is to design a standard heater with fixed warm radius to warm all the houses. Now, you are given positions of houses a......

叶枫啦啦
2017/12/11
0
0
java 快排的思路与算法

java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下。直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了。...

年少爱追梦
2016/03/07
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[MicroPython]STM32F407开发板驱动OLED液晶屏

1.实验目的 1.学习在PC机系统中扩展简单I/O 接口的方法。 2.进一步学习编制数据输出程序的设计方法。 3.学习 F407 Micropython开发板控制OLED显示字符。 2.所需元器件 F407 Micropython开发板...

bodasisiter
22分钟前
0
0
php require和include 相对路径一个有趣的坑

以前总是被教育,不要使用相对路径,这样性能比较差,但是相对路径的问题不仅仅是性能哦,看下面这里例子 这是项目结构 .├── main.php├── t│ ├── t1.php│ └── t2.php└─...

anoty
22分钟前
9
0
x64技术之SSDT_Hook

测试环境: 虚拟机: Windows 7 64bit 过PG工具 驱动加载工具 PCHunter64 系统自带的计算器和任务管理器等 实现思路: 实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕...

simpower
23分钟前
0
0
TreeMap源码分析,看了都说好

一、简介 TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很...

Java小铺
33分钟前
0
0
协变、逆变

概念 假设 A、B表示类型 ≤ 表示继承关系 f<⋅>表示类型转换 若A ≤ B,则 A是B的子类,B是A的超类 协变、逆变 什么是型变?型变(type variance)允许对类型进行子类型转换。 为了下面讲解先...

obaniu
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部