文档章节

深入了解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

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

Java Lambda示例

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

Jack_1900 ⋅ 2014/07/22 ⋅ 2

Comparator与Comparable的应用

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

mrliuze ⋅ 2015/08/04 ⋅ 0

java底层比较器Comparable和Comparator比较对象时的使用

刚开始学习java时可能对这2个接口存在一定的疑惑,对于Comparable意思是说:可以与此对象进行比较的那些对象的类型, 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然...

strict_nerd ⋅ 2015/05/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 50分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 59分钟前 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部