Stream Operation of Two dimensional array

  • A+
Category:Languages

I am trying to find the best average score from below two dimensional array:

String[][] scores = { { "Amit", "70" }, { "Arthit", "60" }, { "Peter", "60" }, { "Arthit", "100" } }; 

The output is: 80 (Arthit's score (60+100)/2)

Till now I solved this problem with below approach, however I am looking for elegant solution with stream:

public static void main(String[] args) {         String[][] scores = { { "Amit", "70" }, { "Arthit", "60" }, { "Peter", "60" }, { "Arthit", "100" } };          int highestAvg = Integer.MIN_VALUE;         Function<String[], Integer> function = new Function<String[], Integer>() {             @Override             public Integer apply(String[] t) {                 int sum = 0, count = 0;                 for (int i = 0; i < scores.length; i++) {                     if (t[0].equals(scores[i][0])) {                         count++;                         sum += Integer.parseInt(scores[i][1]);                     }                 }                 int avg = sum / count;                 return highestAvg < avg ? avg : highestAvg;             }         };         System.out.println(Arrays.stream(scores).map(function).max((o1, o2) -> o1.compareTo(o2)).get());     } 

Would you please suggest, what's the better approach to handle two dimensional array using stream?

Note: I am not looking the exact solution, just looking your valuable suggestion.

 


You can make more use of built-in stream features, including averaging and grouping collectors:

Stream.of(scores)         .collect(                 Collectors.groupingBy(a -> a[0],                  Collectors.averagingInt(a -> Integer.parseInt(a[1]))))         .entrySet()         .stream()         .max(Entry.comparingByValue())         .ifPresent(bestScore -> {                 String message = String.format("Best score is %s, by %s", bestScore.getValue(), bestScore.getKey());                 System.out.println(message);         }); 

Which prints Best score is 80.0, by Arthit

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: