1700443490
1700443491
接着往下思考,如果要查找仅次于最大值的元素(也就是老二),该如何处理呢?要注意,数组的元素是可以重复的,最大值可能是多个,所以单单一个排序然后取倒数第二个元素是解决不了问题的。
1700443492
1700443493
此时,就需要一个特殊的排序算法了,先要剔除重复数据,然后再排序。当然,自己写算法也可以实现,但是集合类已经提供了非常好的方法,要是再使用数组自己写算法就显得有点过时了。数组不能剔除重复数据,但Set集合却是可以的,而且Set的子类TreeSet还能自动排序。代码如下:
1700443494
1700443495
public static int getSecond(Integer[]data){
1700443496
1700443497
//转换为列表
1700443498
1700443499
List<Integer>dataList=Arrays.asList(data);
1700443500
1700443501
//转换为TreeSet,删除重复元素并升序排列
1700443502
1700443503
TreeSet<Integer>ts=new TreeSet<Integer>(dataList);
1700443504
1700443505
//取得比最大值小的最大值,也就是老二了
1700443506
1700443507
return ts.lower(ts.last());
1700443508
1700443509
}
1700443510
1700443511
剔除重复元素并升序排列,这都由TreeSet类实现的,然后可再使用lower方法寻找小于最大值的值。大家看,上面的程序非常简单吧?那如果是我们自己编写代码会怎么样?那至少要遍历数组两遍才能计算出老二的值,代码的复杂度将大大提升。
1700443512
1700443513
也许你会说,这个要求有点变态,怎么会有这样的需求?不,有这样的需求很正常,比如在学校按成绩排名时,如果一个年级有1200人,只要找出最高的三个分数(可不一定就是3个人,也可能是多人),是不是就是这种情况呢?因此在实际应用中求最值,包括最大值、最小值、第二大值、倒数第二小值等,使用集合是最简单的方式,当然若从性能方面来考虑,数组是最好的选择。
1700443514
1700443515
注意 最值计算时使用集合最简单,使用数组性能最优。
1700443516
1700443517
1700443518
1700443519
1700443521
编写高质量代码:改善Java程序的151个建议 建议65:避开基本类型数组转换列表陷阱
1700443522
1700443523
我们在开发过程中经常会使用Arrays和Collections这两个工具类在数组和列表之间转换,非常方便,但也有时候会出现一些奇怪的问题,来看如下代码:
1700443524
1700443525
public static void main(String[]args){
1700443526
1700443527
int[]data={1,2,3,4,5};
1700443528
1700443529
List list=Arrays.asList(data);
1700443530
1700443531
System.out.println(“列表中的元素数量是:”+list.size());
1700443532
1700443533
}
1700443534
1700443535
也许你会说,这很简单,list变量的元素数量当然是5了。但是运行后打印出来的列表数量却是1。
1700443536
1700443537
事实上data确实是一个有5个元素的int类型数组,只是通过asList转换成列表后就只有1个元素了,这是为什么呢?其他4个元素到什么地方去了呢?
1700443538
1700443539
我们仔细看一下Arrays.asList的方法说明:输入一个变长参数,返回一个固定长度的列表。注意这里是一个变长参数,看源代码:
[
上一页 ]
[ :1.70044349e+09 ]
[
下一页 ]