java中random方法取值范围_java中最值的求法,你可能忽略了这种方法了!
对一批数据进行排序,然后找出其中的最大值或最小值,这是基本的数据结构知识。在Java中我们可以通过编写算法的方式,也可以通过数组先排序再取值的方式来实现。下面以求最大值为例,解释一下多种算法。
自行实现,快速查找最大值
先来看用快速查找法取最大值的算法,其代码如下:
这是我们经常使用的最大值算法,也是速度最快的算法。它不要求排序,只要遍历一遍数组即可找出最大值。
先排序,后取值
对于求最大值,也可以采用先排序后取值的方式,同样比较简单,代码如下:
从效率上来讲,当然是自己写快速查找法更快一些了,只用遍历一遍就可以计算出最大值。但在实际测试中我们发现,如果数组数量少于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中最值的求法,你可能忽略了这种方法了!相关推荐
- java中random方法取值范围_Java中的Random()函数
今天在做Java练习的时候注意到了Java里面的一个随机函数--Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中存在 ...
- java cookie 取不到_java中Servlet Cookie取不到值原因解决办法
java中Servlet Cookie取不到值原因解决办法 现象: 在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到 ...
- java set取最大最小_Java中取得数组中最大(小)元素的几种实现方法
简介 本篇文章将主要介绍获取数组中最大(小)元素的基本方法,以及其在Java中的几种实现方法. 算法 取得数组中最大(小)元素的基本算法一般都类似于如下所示: SET MAX to array[0] ...
- hashset java 键值对_Java中的各个容器的性能对比
java中个个容器的属性,性能,参数对比: Java容器的性能及属性的对比 List:Vector,ArrayList,LinkedList Vector:内部是数组数据结构,可以理解为加锁的Arra ...
- 写出一下Java方法对应的签名_Java中的方法签名是否包含其返回类型?
Java类/接口中的方法签名是否包括其返回类型? 例: Java是否知道这两种方法之间的区别: public class Foo { public int myMethod(int param) { ...
- java shiro盐值加密_java中spring-shiro实现密码的MD5盐值加密
看了网上很多教程,都提到有配置spring shiro的密码加密方式,甚至给出了自定义的Class来实现.却很少有通过配置来解决的. 密码的盐值加密方式应该是非常通用的,也可以算是基础吧.按理说spr ...
- java数组的长度不确定怎么办_java中申请不定长度数组ArrayList的方法
如下所示: import java.util.arraylist; //java中申请不定长度数组 public class test01 { public static void main(stri ...
- java中基本字节输出流类是_java中基本输入输出流的解释
网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同:向客户传送数据与写入一个文件也没有什么区别. Java中输入 ...
- Java所有函数都是动态的_Java中的函数动态调用
//------------------------------------- //类ArgumentHolder //用于调用参数的封装,实现变长参数及 //不同类型参数的统一形式地传递 //成员变 ...
最新文章
- 比特安索孟雄晖:软件授权的新开始
- [云炬创业基础笔记] 第四章测试2
- 控制面版中文件服务器属性,《服务器配置与管理》第3章基本配置.pptx
- 微智魔盒骗局_微智魔盒官宣
- OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并
- linux游戏调试,LINUX游戏服务器的安装与调试.doc
- 使用pycharm创建一个项目 利用自己建好的虚拟环境
- socket编程实例_NIO之网络编程源码阅读
- 关于JDK中的集合总结(二)
- linux中使用egrep取值ip地址,egrep命令_Linux egrep 命令用法详解:在文件内查找指定的字符串...
- 从零开始做Vue前端架构(2)
- /etc/config/wireless解析
- dell 恢复介质_如何使用Dell DataSafe Local Backup创建系统恢复介质
- excel有的单元文字可以超出单元格_在excel单元格超过字数限制的设置方法 excel单元格字数限制...
- PerfDog常见问题解决
- RK3399平台开发系列讲解(以太网)5.11、PHY工作的代码流程
- 你了解石墨烯的特性、应用?都有什么?
- 在Altium Designer 2022中创建一个完整的PCB电子设计工程项目(超详细)
- MySQL连接报ERROR 2003(HY000) Can‘t connect to MySQL server on ‘xxxIP‘(113)
- 垂直摄影——pix4d 4.4.10软件(附软件安装包)
热门文章
- GO语言学习之路20
- 使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
- C语言之枚举的定义以及测试
- 转错误	x	error LNK1104: 无法打开文件“E:\xxxx\Debug\xxxx.exe”
- TCP三次握手/四次分手详解
- mysql文件写入和读出数据库
- 2021年年度最优质开源软件
- 推理速度快千倍!谷歌开源语言模型Transformer-XL
- dd linux 尾部添加0_dd使用方法详解
- 透过“简书钻”来探究简书的商业模式转变