根据arraylist中的百分比计算记录数

时间:2017-01-19 16:33:31

标签: java arraylist

我有一个Arraylist,其中包含一个记录列表,在每个记录中我都有百分比字段。

我试图显示两者之间有百分比的学生数量

  

40%至50%,   51%至60%,   61%至70%,   71%至80%,   81%至90%,   91%至100%。

例如,假设有5名学生介于61%至70%之间,我希望计数为5。 如何计算具有指定百分比动态的所有学生的数量。 任何人都可以建议我在这方面采取的方法。

3 个答案:

答案 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;
  }

}