对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排序算法做特别要求,排序只是当前题目的一个小过程的话我们大可不必自己实现以便排序算法,因为Java中已经提供了几个对数据做排序的方法。

文章目录

  • 用Array.sort()进行排序
  • Arrays.parallelSort() 是什么 和 Array.sort()有什么区别
  • 用 Collections.sort()进行排序

用Array.sort()进行排序

Java中对数组类型的数据有Array.sort(),具体如下:

使用上图第一个重载:

//用Java中有的数据类型做数组public static void main(String[] args) {int[] array = { 5, 3, 2, 1, 4, 6, 9, 8};Arrays.sort(array);System.out.println(Arrays.toString(array));}

运行结果:

如果用自己的实现类做数组的话因为在排序过程中需要比较两个元素的大小,这个实现类必须实现Comparable接口(这篇博客会用到Comparable和Comparator两个接口,不会的同学请补这篇博客:Java中的Comparable和Comparator到底该怎么用看完就全明白了):

//这是一个自己的实现类Ha,并且这个类实现了Comparable接口,
//意味着同类型对象之间可以进行比较
public class Ha implements Comparable<Ha>{int haVal;public Ha(int h ){haVal = h;}@Overridepublic String toString() {return"haVal=" + haVal;}@Overridepublic int compareTo(Ha o) {//因为方法是拿当前对象compareTo传入对象o//所以://返回负数表示当前对象比传入对象o小//返回正数反之return this.haVal - o.haVal;}
}

下面构建一个Ha[]数组并对它排序:

public class Demo7 {public static void main(String[] args) {//创建几个Ha类型对象Ha a = new Ha(1);Ha b = new Ha(2);Ha c = new Ha(3);Ha d = new Ha(4);Ha e = new Ha(5);Ha f = new Ha(6);//将上面的对象放到Ha[]数组中Ha[] array = {f, d, c, e, b, a};Arrays.sort(array);System.out.println(Arrays.toString(array));}
}

运行结果:

使用第二个重载:

public static void main(String[] args) {int[] array = { 5, 3, 2, 1, 4, 6, 9, 8};//只会对指定区间内的数据排序,而且是左闭右开Arrays.sort(array, 0, 3);System.out.println(Arrays.toString(array));}

运行结果:

很明显他只对[fromIndex, toIndex)区间做了排序。

使用第三个重载:

这个方法是在排序的时候传入数组的同时传入一个比较器,传入比较器有什么用呢?

  1. 对于已经实现了Comparable的类(Integer等基础类型的包装类都实现了Comparable接口)来说sort方法会将它们按规则升序排序,如果你想降序排序那么你可以在这里传入一个比较器来实现目的:
public static void main(String[] args) {Integer[] array = { 5, 3, 2, 1, 4, 6, 9, 8};Arrays.sort(array, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});System.out.println(Arrays.toString(array));}

运行结果:

这里需要注意使用这个重载数组类型不能是int,short等基础数据类型,需要的是他们的包装类。

  1. 对于没有实现Comparable的自己的类,可以在使用该重载的时候传入一个Comparator,而不用在回去给自己的类实现Comparable(相信对这两个比较接口不熟悉的同学这会已经晕了,去补博客吧哈哈)
//这是一个没有实现Comparable接口的Ha类
public class Ha {int haVal;public Ha(int h ){haVal = h;}@Overridepublic String toString() {return"haVal=" + haVal;}
}

如果使用这个类去做sort的时候会报错:

public static void main(String[] args) {//创建几个Ha类型对象Ha a = new Ha(1);Ha b = new Ha(2);Ha c = new Ha(3);Ha d = new Ha(4);Ha e = new Ha(5);Ha f = new Ha(6);//将上面的对象放到Ha[]数组中Ha[] array = {f, d, c, e, b, a};//直接排序Arrays.sort(array);System.out.println(Arrays.toString(array));}


传入了一个Comparator就可以了:

 public static void main(String[] args) {Ha a = new Ha(1);Ha b = new Ha(2);Ha c = new Ha(3);Ha d = new Ha(4);Ha e = new Ha(5);Ha f = new Ha(6);Ha[] array = {f, b, c, d, a};Arrays.sort(array, new Comparator<Ha>() {@Overridepublic int compare(Ha o1, Ha o2) {return o1.haVal - o2.haVal;}});System.out.println(Arrays.toString(array));}

运行结果:

对于第四个重载:

可以结合第二个和第三个去理解。

Arrays.parallelSort() 是什么 和 Array.sort()有什么区别

与Array.sort()不同的是Arrays.parallelSort() 是并行排序,就是java会将待排序数组分成好几个部分,然后创建好几个线程去对不同的部分同时进行排序最后将各个线程的排序结果归并到一起,听起来好像Arrays.parallelSort() 要比Array.sort()快一些,其实则不然,因为创建线程这个操作会有性能的损耗,如果数据量小的时候再去创建多线程那么速度并没有Array.sort()快,只有当数据量很大的时候用 Arrays.parallelSort()会比 Array.sort()快,那么这个界限是多少呢?Java在实现Arrays.parallelSort()时候做了规定当数据量小于8192的时候即使调用Arrays.parallelSort(),系统还是会选择Array.sort()去做排序。
至于Arrays.parallelSort()方法的重载其实和 Array.sort()都差不多,只是前者背后有了并行排序这个操作。

所以对于Arrays.parallelSort()的这几个重载大家对照这Array.sort()的去理解就好了

用 Collections.sort()进行排序

这个方法是对List进行排序:

要求还是和Arrays.sort()一样,需要List内的元素的实现类实现Comparable接口或者,如第二个重载所示在排序时传入一个Comparator就可了,这里就不做过多赘述了,直接演示:

 //当传入的类实现了Comparable接口时可以直接对list排序public static void main(String[] args) {Ha a = new Ha(1);Ha b = new Ha(2);Ha c = new Ha(3);Ha d = new Ha(4);Ha e = new Ha(5);Ha f = new Ha(6);List<Ha> list = new ArrayList<>();list.add(b);list.add(c);list.add(d);list.add(a);list.add(f);list.add(e);//默认升序Collections.sort(list);System.out.println(list);}

运行结果:

 public static void main(String[] args) {//没有实现Comparable接口的类需要传入ComparatorHa a = new Ha(1);Ha b = new Ha(2);Ha c = new Ha(3);Ha d = new Ha(4);Ha e = new Ha(5);Ha f = new Ha(6);List<Ha> list = new ArrayList<>();list.add(b);list.add(c);list.add(d);list.add(a);list.add(f);list.add(e);//默认升序Collections.sort(list, new Comparator<Ha>() {@Overridepublic int compare(Ha o1, Ha o2) {//返回值是负数说明前者比后者小return o1.haVal - o2.haVal;}});System.out.println(list);}

运行结果:

更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()相关推荐

  1. 更高效地刷OJ——String常用方法(一)

    因为常用方法较多,所以分为3篇 1.length() : 返回字符串长度,此处的length有别于数组中的length数组中的length为属性,此处的length为方法. 2.charAt() :将 ...

  2. 5种JavaScript中常用的排序方法

    5种JavaScript中常用的排序方法 01.冒泡排序 通过相邻数据元素的交换,逐步将待排序序列变为有序序列,如果前面的数据大于后面的数据,就将两值进行交换,将数据进行从小到大的排序,这样对数组的第 ...

  3. Java中常用的加密方法(JDK)

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  4. java中常用的加密方法_java中常用的数据加密算法

    [项目中第一次深入地了解到加密算法的使用,现第一阶段结束,将使用到的加密算法和大家分享一下:首先还是先给大家普及一下常用加密算法的基础知识基本的单向加密算法BASE6 以下为加密的工具类: impor ...

  5. java中常用的一些方法(一)

    1.float型金额(单位:元)无精度损失转为long型(单位为:分) public static long parseMoney(String string){if(string.startsWit ...

  6. java中常用的String方法

    package com.test;import java.io.Console; import java.util.Arrays; import java.util.Scanner;public cl ...

  7. java中常用的一些方法

    字符串 1.获取字符串的长度 length() 2 .判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s) 后缀 endsWith(String s) 3.比较两 ...

  8. Java中常用的String方法解析和使用示例

    substring(beginIndex)与substring(beginIndex, endIndex) 上下界的位置. // substring(beginIndex)String str1 = ...

  9. java 中的排序_浅谈java中常见的排序

    浅谈java中常见的排序 学过java的人都知道,排序这一部分初次接触感觉还是有点难以理解,很多地方也会用到.然而,在java中常见的排序方法:冒泡排序,选择排序,插入排序等等.下面就让我们一起揭开他 ...

最新文章

  1. 用户输入一个数字,找到所有能够除尽它的数的总个数
  2. 方差/标准差/四分位数/z-score公式
  3. brain teasers
  4. 复现经典:《统计学习方法》第 7 章 支持向量机
  5. Android切换到主线程
  6. java大神请出来_求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因。...
  7. 同步数据库仅在Worker内,目前只有Chrome6支持
  8. sqoop从musql导入到hive中数据缺失
  9. csharp添加引用路径_C# 在Word中添加Latex 数学公式和符号
  10. 高等数学第七版同济大学课后习题讲解上下册
  11. 开放网络操作系统介绍(2)、SONiC
  12. 只能修饰唯一一个html元素的选择器是,HTML常用标签和CSS选择器的使用及演示——2019.1.14...
  13. 计算机课程之间的关系
  14. c语言设置字体时调用对话框,第1课用C语言函数编写对话框之一直接实践
  15. 大家好,我是数学家!来抢诺贝尔奖了!
  16. echarts热力背景图_echarts自定义背景图片
  17. Godot3游戏引擎入门之四:给主角添加动画(上)
  18. 全套机密PS技术,你在学校里十二年,也学不到这么多
  19. XML:Schema、三种编写Schema的方式
  20. WPF学习之深入浅出话属性

热门文章

  1. 六步实现Spring.NET 与 NHibernate 的整合
  2. 模块的封装性分析-读书笔记
  3. OpenJudge数据结构与算法-计算点的距离并排序
  4. js 一些的数组的方法
  5. Elementui 自定义loading
  6. Array提供的方法
  7. [jQuery基础] jQuery对象 -- 选择器
  8. Python爬虫_Cookie
  9. Dom-to-image
  10. html + css + js 实现简易计算器