对一批数据进行排序,然后找出其中的最大值或最小值,这是基本的数据结构知识。在Java中我们可以通过编写算法的方式,也可以通过数组先排序再取值的方式来实现。下面以求最大值为例,解释一下多种算法。

  1. 自行实现,快速查找最大值

先来看用快速查找法取最大值的算法,其代码如下:

这是我们经常使用的最大值算法,也是速度最快的算法。它不要求排序,只要遍历一遍数组即可找出最大值。

  1. 先排序,后取值

对于求最大值,也可以采用先排序后取值的方式,同样比较简单,代码如下:

从效率上来讲,当然是自己写快速查找法更快一些了,只用遍历一遍就可以计算出最大值。但在实际测试中我们发现,如果数组数量少于1万,两者基本上没有差别,在同一个毫秒级别里,此时就可以不用自己写算法了,直接使用数组先排序后取值的方式。

如果数组元素超过1万,就需要依据实际情况来考虑:自己实现,可以提升性能;先排序后取值,简单,通俗易懂。排除性能上的差异,两者都可以选择,甚至后者更方便一些,也更容易想到。

现在问题来了,在代码中为什么要先使用data.clone拷贝再排序呢?那是因为数组也是一个对象,不拷贝不就改变了原有数组元素的顺序吗?除非数组元素的顺序无关紧要。

接着往下思考,如果要查找仅次于最大值的元素(也就是老二),该如何处理呢?要注意,数组的元素是可以重复的,最大值可能是多个,所以单单一个排序然后取倒数第二个元素是解决不了问题的。

此时,就需要一个特殊的排序算法了,先要剔除重复数据,然后再排序。当然,自己写算法也可以实现,但是集合类已经提供了非常好的方法,要是再使用数组自己写算法就显得有点过时了。数组不能剔除重复数据,但Set集合却是可以的,而且Set的子类TreeSet还能自动排序。代码如下:

剔除重复元素并升序排列,这都由TreeSet类实现的,然后可再使用lower方法寻找小于最大值的值。大家看,上面的程序非常简单吧?那如果是我们自己编写代码会怎么样?那至少要遍历数组两遍才能计算出老二的值,代码的复杂度将大大提升。

也许你会说,这个要求有点变态,怎么会有这样的需求?不,有这样的需求很正常,比如在学校按成绩排名时,如果一个年级有1200人,只要找出最高的三个分数(可不一定就是3个人,也可能是多人),是不是就是这种情况呢?因此在实际应用中求最值,包括最大值、最小值、第二大值、倒数第二小值等,使用集合是最简单的方式,当然若从性能方面来考虑,数组是最好的选择。

本文参考自:《编写高质量代码:改善java程序的151个建议》

作者:秦小波

声明:本文只供学习使用,未涉及任何商业利益,如有侵权,立删。

往期精彩

在明确的场景下,为集合指定初始容量

2020-09-26

若有必要,使用变长数组

2020-09-24

警惕数组的浅拷贝

2020-09-25

stracth制作蜗牛与黄鹂鸟和两只老虎

2020-09-23

某些时候,数组的性能要比集合快10倍!

2020-09-20

支持作者

赞赏就不用啦,生活都不易,右下角的“在看/赞”点一下,如果感觉文章不错,记得分享到朋友圈让更多人知道!

点分享

点点赞

点在看

java中random方法取值范围_java中最值的求法,你可能忽略了这种方法了!相关推荐

  1. java中random方法取值范围_Java中的Random()函数

    今天在做Java练习的时候注意到了Java里面的一个随机函数--Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中存在 ...

  2. java cookie 取不到_java中Servlet Cookie取不到值原因解决办法

    java中Servlet Cookie取不到值原因解决办法 现象: 在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到 ...

  3. java set取最大最小_Java中取得数组中最大(小)元素的几种实现方法

    简介 本篇文章将主要介绍获取数组中最大(小)元素的基本方法,以及其在Java中的几种实现方法. 算法 取得数组中最大(小)元素的基本算法一般都类似于如下所示: SET MAX to array[0] ...

  4. hashset java 键值对_Java中的各个容器的性能对比

    java中个个容器的属性,性能,参数对比: Java容器的性能及属性的对比 List:Vector,ArrayList,LinkedList Vector:内部是数组数据结构,可以理解为加锁的Arra ...

  5. 写出一下Java方法对应的签名_Java中的方法签名是否包含其返回类型?

    Java类/接口中的方法签名是否包括其返回类型? 例: Java是否知道这两种方法之间的区别: public class Foo { public int  myMethod(int param) { ...

  6. java shiro盐值加密_java中spring-shiro实现密码的MD5盐值加密

    看了网上很多教程,都提到有配置spring shiro的密码加密方式,甚至给出了自定义的Class来实现.却很少有通过配置来解决的. 密码的盐值加密方式应该是非常通用的,也可以算是基础吧.按理说spr ...

  7. java数组的长度不确定怎么办_java中申请不定长度数组ArrayList的方法

    如下所示: import java.util.arraylist; //java中申请不定长度数组 public class test01 { public static void main(stri ...

  8. java中基本字节输出流类是_java中基本输入输出流的解释

    网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同:向客户传送数据与写入一个文件也没有什么区别. Java中输入 ...

  9. Java所有函数都是动态的_Java中的函数动态调用

    //------------------------------------- //类ArgumentHolder //用于调用参数的封装,实现变长参数及 //不同类型参数的统一形式地传递 //成员变 ...

最新文章

  1. 比特安索孟雄晖:软件授权的新开始
  2. [云炬创业基础笔记] 第四章测试2
  3. 控制面版中文件服务器属性,《服务器配置与管理》第3章基本配置.pptx
  4. 微智魔盒骗局_微智魔盒官宣
  5. OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并
  6. linux游戏调试,LINUX游戏服务器的安装与调试.doc
  7. 使用pycharm创建一个项目 利用自己建好的虚拟环境
  8. socket编程实例_NIO之网络编程源码阅读
  9. 关于JDK中的集合总结(二)
  10. linux中使用egrep取值ip地址,egrep命令_Linux egrep 命令用法详解:在文件内查找指定的字符串...
  11. 从零开始做Vue前端架构(2)
  12. /etc/config/wireless解析
  13. dell 恢复介质_如何使用Dell DataSafe Local Backup创建系统恢复介质
  14. excel有的单元文字可以超出单元格_在excel单元格超过字数限制的设置方法 excel单元格字数限制...
  15. PerfDog常见问题解决
  16. RK3399平台开发系列讲解(以太网)5.11、PHY工作的代码流程
  17. 你了解石墨烯的特性、应用?都有什么?
  18. 在Altium Designer 2022中创建一个完整的PCB电子设计工程项目(超详细)
  19. MySQL连接报ERROR 2003(HY000) Can‘t connect to MySQL server on ‘xxxIP‘(113)
  20. 垂直摄影——pix4d 4.4.10软件(附软件安装包)

热门文章

  1. GO语言学习之路20
  2. 使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
  3. C语言之枚举的定义以及测试
  4. 转错误 x error LNK1104: 无法打开文件“E:\xxxx\Debug\xxxx.exe”
  5. TCP三次握手/四次分手详解
  6. mysql文件写入和读出数据库
  7. 2021年年度最优质开源软件
  8. 推理速度快千倍!谷歌开源语言模型Transformer-XL
  9. dd linux 尾部添加0_dd使用方法详解
  10. 透过“简书钻”来探究简书的商业模式转变