2017-01-19 1 views
1

私はArraylistを持っています。これにはレコードのリストが含まれており、各レコードにはパーセンテージフィールドがあります。アライリストにあるパーセンテージに基づいてレコードの数をカウントします。

私は 71%〜80%、 61%〜70%、

40%〜50%の間で 51%〜60%の割合を持っている学生の数を表示しようとしています、 81%~90%、 91%~100%である。

例えば、私は私が指定した割合動的ですべての学生の数を取得できますか5. としてカウントを取得したい%70%61の間で5人の学生があるとします。 誰も私にこの点に従うアプローチを提案できますか?

+1

動的にはどういう意味ですか?リストが変わると、 – efekctive

+2

'動的に'とはどういう意味ですか? –

+0

「動的に」とは、「指定された任意の範囲で」を意味しますか? – Bohemian

答えて

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)); 

このグループ(intをパーセンテージにキャストを追加することが整数ではない場合):


収集し、10点ブラケットの範囲にも反復します下流のカウント動作を追加し、次にそれぞれを処理する。

TreeMapラッパーはパーセンテージ範囲を順序付けします。

+0

あなたはそれを説明しようとすることができますか? –

+0

私は彼がMap 、Int>のような結果を得たいと思います。 – Manza

+0

@Shashwatについて説明しました – Bohemian

2

私は、ストリームに近づくビット更を取る:

Map<PercentageRange, Integer> counts = 
    list.stream() 
     .collect(Collectors.groupingBy( 
      student -> rangeOf(student.getPercentage())), 
      Collectors.counting())); 
0

あなたは、ラムダ式を使用する必要があります。これにより、指定されたすべての範囲と生徒の地図が表示されます。

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

} 
関連する問題