主页 > 数据处理 > java怎样将集合中的数值数据分区间统计个数:例如(0-1000)有几个人数据,1000-2000有几个数据

java怎样将集合中的数值数据分区间统计个数:例如(0-1000)有几个人数据,1000-2000有几个数据

2022-01-10 23:42来源:m.sf1369.com作者:宇宇

集合分组统计处理, 实现的方法很多,简单的写几种方法供参考;(理解后,自行扩展完善)
方法一:(Java8流处理粗略版) 该版本存在的问题:有些区间没有数据,就不打印显示该区间
import java.util.*;
import java.util.stream.*;

public class NumberDemo {
public static void main(String[] args) {

ArrayList<Integer> list = new ArrayList<Integer>();
int numbers = 10;// 集合里数字的个数
int space = 1000;// 区间的间隔

// 给集合里添加数字
Random rd = new Random();
for (int i = 0; i < numbers; i++) {
list.add(rd.nextInt(5000)); // 集合里每个数字的范围是0~4999
}

funStream(list, space);
}

private static void funStream(ArrayList<Integer> list, int space) {
// 使用流处理 把 数字分组
Map<String, List<Integer>> map = list.stream().collect(Collectors.groupingBy((num) -> {
return 区间:[ + num / space * space + , + (num / space + 1) * space + );// 分组规则
}));
map.forEach((k,v)->{
System.out.println(k);
System.out.println(\t+v.size()+个数据);
});
}
}方法二:(Java8流处理详细版) 就算有的区间是0个数据,照样打印出来
import java.util.*;
import java.util.stream.*;

public class NumberDemo2 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
int numbers = 10;// 集合里数字的个数
int space = 1000;// 区间的间隔

// 给集合里添加数字
Random rd = new Random();
for (int i = 0; i < numbers; i++) {
list.add(rd.nextInt(5000)); // 集合里每个数字的范围是0~4999
}

funStream(list, space);
}

private static void funStream(ArrayList<Integer> list, int space) {
// 使用流处理 把 数字分组
Map<Integer, List<Integer>> map = list.stream().collect(Collectors.groupingBy((num) -> {
return num / space;// 分组规则
}));

// 获取集合里的最大值
Optional<Integer> maxop = list.stream().collect(Collectors.maxBy(Integer::compareTo));
int max = maxop.orElse(0);
// 计算出区间的数量
int groups = max % space == 0 ? max / space : max / space + 1;
// 打印结果
for (int i = 0; i < groups; i++) {
System.out.println(区间:[ + i * space + , + (i + 1) * space + ));
System.out.println(\t有 + (map.get(i)==null?0:map.get(i).size()) + 个数据);
// System.out.println(\t+map.get(i));//把数据打印出来
}
}
}方法三:(比较传统的方法)
import java.util.*;

public class NumberDemo3 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
int numbers = 10;// 集合里数字的个数
int space = 1000;// 区间的间隔

//给集合里添加数字
Random rd = new Random();
for (int i = 0; i < numbers; i++) {
list.add(rd.nextInt(5000)); // 集合里每个数字的范围是0~4999
}

fun(list,space);
}
private static void fun(ArrayList<Integer> list, int space) {
Collections.sort(list);//排序
int max= list.get(list.size()-1);//取得最大值
int groups = max % space == 0 ? max / space : max / space + 1;//取得区间的数量
HashMap<Integer,ArrayList<Integer>> map=new HashMap<Integer, ArrayList<Integer>>();//存区间和该区间的数字
for (int i = 0; i < groups; i++) {
map.put(i, new ArrayList<>());
}
//把元素添加到指定的区间
for (int i = 0; i < list.size(); i++) {
map.get(list.get(i)/space).add(list.get(i));
}
//打印结果
for (int i = 0; i < groups; i++) {
System.out.println(区间:[ + i * space + , + (i + 1) * space + ));
System.out.println(\t有+ map.get(i).size()+个数据);
//System.out.println(\t+map.get(i));//把数据打印出来
}
}
}测试效果如下
区间:[0,1000)
有5个数据
区间:[1000,2000)
有0个数据
区间:[2000,3000)
有1个数据
区间:[3000,4000)
有2个数据
区间:[4000,5000)
有2个数据

相关推荐

车联网企业国内有哪些?

数据处理 2023-12-23

注册计量师-请教贴

数据处理 2023-12-19

逆光照片怎么处理

数据处理 2023-12-08