❤️作者主页:温文尔雅的清欢渡
❤️欢迎 点赞 👍 收藏 ⭐ 留言 📝 关注 ✌ 私聊我
前言
最近有个朋友给我出了个题目:有n个数字,连续3个数算出一个平均值,求最大的平均值?
例如数字有1,2,3,4,5,6,7,8,9,10,共十个数,平均数就是(1+2+3)/3,(2+3+4)/3等等,最大平均数毋庸置疑,就是(8+9+10)/3。
解决思路
1.先不除3,求得所有情况的和,得到一个list。
2.求list中的最大值,除3拿到最大平均值。
int [] arr= {1,2,3,4,5,6,7,8,9,10};
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr.length-3; i++) {
list.add(arr[i]+arr[i+1]+arr[i+2]);
}
System.out.println("所有情况的和"+list);
Integer max = list.stream().max(Comparator.comparing(Integer::intValue)).get();
System.out.println("最大平均值是"+max/3.0);
引入工作场景
数字的类型为BigDecimal对象,且数据是用SQL查询出来的。
解决方案一
//priceList是用sql查出来的数据
List<BigDecimal> priceList= tmpDao.getPrice(tmpDto);
List<BigDecimal> list = new ArrayList<>();
for (int i = 0; i < priceList.size()-3; i++) {
list.add( priceList.get(i).add(priceList.get(i + 1)).add(priceList.get(i + 2)));
}
BigDecimal max = list.stream().max(Comparator.comparing(BigDecimal::toString)).get();
这里有一个Demo
List<BigDecimal> priceList=new ArrayList<>();
priceList.add(new BigDecimal(1));
priceList.add(new BigDecimal(2));
priceList.add(new BigDecimal(3));
priceList.add(new BigDecimal(4));
priceList.add(new BigDecimal(5));
priceList.add(new BigDecimal(6));
priceList.add(new BigDecimal(7));
priceList.add(new BigDecimal(8));
priceList.add(new BigDecimal(9));
priceList.add(new BigDecimal(10));
List<BigDecimal> list = new ArrayList<>();
for (int i = 0; i < priceList.size()-4; i++) {
list.add( priceList.get(i).add(priceList.get(i + 1)).add(priceList.get(i + 2)).add(priceList.get(i + 3)));
}
BigDecimal max = list.stream().max(Comparator.comparing(BigDecimal::toString)).get();
System.out.println("最大平均值是"+max.divide(new BigDecimal(3)));
解决方案二
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
List<Double> avgList = list.stream().map(li -> {
// 获取当前元素的索引
int index = list.indexOf(li);
Double avg = null;
//index 从0开始记起
if ((index + 2) < list.size()) {
avg = (list.get(index) + list.get(index + 1) + list.get(index + 2)) / 3.0;
}
return avg;
}).filter(Objects::nonNull).collect(Collectors.toList());
Double max = avgList.stream().reduce(Double::max).get();
System.out.println("所有的平均值:" +avgList);
System.out.println("最大值平均值:" + max);