文档章节

深入了解Arrays.sort()

奋斗到天明
 奋斗到天明
发布于 2015/08/27 17:39
字数 852
阅读 46
收藏 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
似懂非懂 Comparable和 Comparator

在java中提供了两种排序方式:Comparable和 Comparator,它们两个看起来非常的相似,在不是很了解的情况下不知道如何使用,什么情况下使用哪个进行排序,接下来就看下它们的一个区别和使用方...

tsmyk0715
09/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

没有更多内容

加载失败,请刷新页面

加载更多

关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
29分钟前
1
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
2
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
25
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
2
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部