文档章节

深入了解Arrays.sort()

奋斗到天明
 奋斗到天明
发布于 2015/08/27 17:39
字数 852
阅读 39
收藏 0
点赞 0
评论 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

java程序员应该掌握的技能

我的总结,一家之言,如有不同意见,你他妈有种说说! 1. 自学能力。能根据现有的问题去利用百度和谷歌查出想要的答案,查不到记得变化关键词 2. 英语阅读能力。很多技术都是老美他们发明的,...

jonathan_loda ⋅ 2015/06/03 ⋅ 6

java 快排的思路与算法

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

年少爱追梦 ⋅ 2016/03/07 ⋅ 0

对字符串数组进行排序,将所有的变位词排在相邻的位置

/** * 功能:对字符串数组进行排序,将所有的变位词排在相邻的位置。 / 两种方法: 方法一: /* * 思路:套用排序算法,并修改比较器。这里比较器用来指示两个字符串胡伟变位词就是相等的。 ...

一贱书生 ⋅ 2016/11/23 ⋅ 0

数组工具类

@Test public void test1() { String[] str = new String[] { "Jack", "Alex", "Ami", "Jerry" }; Arrays.sort(str); // 显示已经排序的数据 System.err.println(Arrays.toString(str)); } ......

Harry_sir ⋅ 2015/12/08 ⋅ 0

Comparator和Comparable在排序中的应用

当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。 一、Comparator 强行对某个对象collection进行整体排序的比较函数...

stefanliao ⋅ 2012/05/29 ⋅ 0

Java Lambda示例

Lambda表达式 —— 用简单的方法实现只有一个函数的接口 Lambda syntax Lambda表达式实例 运行Runnable PI函数 根据字符串长度来排序字符串 高效的final变量可以在lambdas中被引用 方法引用 ...

Jack_1900 ⋅ 2014/07/22 ⋅ 2

Maximum Length of Pair Chain

问题: You are given pairs of numbers. In every pair, the first number is always smaller than the second number. Now, we define a pair can follow another pair if and only if . C......

叶枫啦啦 ⋅ 01/12 ⋅ 0

Comparator与Comparable的应用

当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。 阅读过程中有任何问题,请联系egg: 邮箱:xtfggef@gmail.com 微...

mrliuze ⋅ 2015/08/04 ⋅ 0

java中Arrays.sort()实现原理

先在网上找到一些说法: java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序。 快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序...

liujiest ⋅ 2016/05/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法之SlopOne

一、 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分。如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个...

xiaomin0322 ⋅ 28分钟前 ⋅ 0

LVM讲解

LVM是什么 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地...

李超小牛子 ⋅ 37分钟前 ⋅ 0

mysql更改密码、连接mysql、mysql常用命令

1. 更改mysql的root账户密码: mysql中root账户和系统root不是一个账户 1.1 更改环境变量PATH,增加mysql绝对路径 由于mysql安装目录为/usr/local/mysql/,所以系统不能直接使用mysql,需把/...

laoba ⋅ 38分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

猫耳m ⋅ 38分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云云栖社区 ⋅ 42分钟前 ⋅ 0

1.03-Maven中使用ueditor富文本编辑器

起因:在maven仓库未找到百度的ueditor的jar包 操作: 1.下载百度的ueditor的jar包 2.打开命令行,切换到ueditor的下载位置,运行一下命令: mvn install:install-file -Dfile=ueditor-1.1....

静以修身2025 ⋅ 47分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 57分钟前 ⋅ 0

包饺子

http://storage.slide.news.sina.com.cn/slidenews/77_ori/2018_24/74766_826131_625489.gif

霜叶情 ⋅ 58分钟前 ⋅ 0

xml解析

方法一: String s_xml1 = "<xml>" + "<head>lalalalal</head>" + "<body>1234</body>" + "</xml>"; try { DocumentBuilderFactory documentBuilderFactory......

GithubXD ⋅ 今天 ⋅ 0

reuse stream

Although Java streams were designed to be operated only once, programmers still ask how to reuse a stream. From a simple web search, we can find many posts with this same issue ......

idoz ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部