我有一个Arraylist
,其中包含一个记录列表,在每个记录中我都有百分比字段。
我试图显示两者之间有百分比的学生数量
40%至50%, 51%至60%, 61%至70%, 71%至80%, 81%至90%, 91%至100%。
例如,假设有5名学生介于61%至70%之间,我希望计数为5。 如何计算具有指定百分比动态的所有学生的数量。 任何人都可以建议我在这方面采取的方法。
答案 0 :(得分:6)
不计算学生,计算他们的百分比,如下:
int count = list.stream()
.map(Student::getPercentage)
.filter(n -> n >= low && n <= high)
.count();
作为一个集合,ArrayList允许我们流式传输Student对象,然后将其转换为百分比流,然后对其进行过滤以仅保留所需范围内的那些百分比,然后对其进行计数。
收集并迭代10个点括号的范围:
new TreeMap<>(list.stream()
.collect(Collectors.groupingBy(s -> s.getPercentage() / 10, Collectors.counting()))
.forEach((r, n) -> System.out.print(r + "0% to " + ++r + "0% had " + n));
这将整数除以10的结果分组(如果它不是整数,则将转换添加到int
的百分比),添加下游计数操作,然后处理每个操作。
TreeMap包装器按顺序放置百分比范围。
答案 1 :(得分:2)
我会更进一步采用流方法:
Map<PercentageRange, Integer> counts =
list.stream()
.collect(Collectors.groupingBy(
student -> rangeOf(student.getPercentage())),
Collectors.counting()));
答案 2 :(得分:0)
您应该使用lambda表达式。这将为您提供包含所有指定范围和学生的地图。
ArrayList<Student> students = new ArrayList<>();
//Each element will have the range as key and all students who fit in the range.
Map<MinMax, List<Student>> map = new HashMap();
//Add all ranges you want to filter your students-list by.
ArrayList<MinMax> minMaxes = new ArrayList<>();
minMaxes.add(new MinMax(20,40);
minMaxes.add(new MinMax(40,60);
minMaxes.add(new MinMax(60,80);
for (MinMax minMax : minMaxes) {
map.put(minMax, students.stream().filter(u -> u.percentage < minMax.min && u.percentage > minMax.max).collect(Collectors.toList()));
}
class MinMax {
private int min;
private int max;
public MinMax(int min, int max) {
this.min = min;
this.max = max;
}
public int getMin() {
return min;
}
public void setMin(int min) {
this.min = min;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
}