Как посчитать среднюю оценку с учетом String [] [] и ожидаемого возврата String [] [] - PullRequest
0 голосов
/ 22 декабря 2019

У меня есть 2d массив данных, в качестве входных данных, где все элементы являются строками. Данные в формате - имя, оценка. Я должен написать метод, принимающий этот массив в качестве входных данных и возвращающий String [] [], показывающий отличное имя и среднее значение оценок. Все это с помощью потоков.

{"Ann", "5"},
{"Tom", "6"},
{"Kate", "3"},
{"Albert", "2"},
{"Ann", "3"},
{"Tom", "1"},
{"Tom", "4"},
{"John", "2"}

То, что я до сих пор достиг, это напечатать этот вывод:

Ann=4.0
Tom=3.6666666666666665
Kate=3.0
John=2.0
Albert=2.0

с этим кодом:

Arrays.stream(input)
        .collect(Collectors.groupingBy(a -> a[0], Collectors.averagingDouble(a -> Double.parseDouble(a[1]))))
        .entrySet().forEach(System.out::println);

(я использую system.outпросто чтобы проверить вывод, так как я застрял.)

Вывод должен быть отсортирован по имени, градации отформатированы в два знака после запятой с помощью DecimalFormat. Пустой массив должен быть возвращен в случае пропуска нулевого ввода (я полагаю, это может быть подсказка об использовании опций).

Я искал различные решения, чтобы дать мне подсказку, но я застрял полностью. Я даже не уверен, является ли мой вывод двухмерным массивом. И это определенно не отсортировано и не отформатировано. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 23 декабря 2019

После сбора в Map вы можете передавать и преобразовывать каждую запись в массив String[], сортируя по имени, а затем использовать toArray для преобразования в массив 2d

String[][] output = Arrays.stream(input)
            .collect(Collectors.groupingBy(a -> a[0], Collectors.averagingDouble(a -> Double.parseDouble(a[1]))))
            .entrySet()
            .stream()
            .sorted(Map.Entry.comparingByKey())
            .map(ar -> new String[] { ar.getKey(), String.format( "%.2f", ar.getValue()) })
            .toArray(String[][]::new);

    System.out.println(Arrays.deepToString(output));  //[[Ann, 5.00], [Tom, 3.50]]

Если входной массив может бытьnull, тогда вы должны проверить перед потоковой передачей массива с помощью тернарного оператора

input = Objects.nonNull(input) ? input : new String[][] {{}};

Вы также можете проверить внутренние объекты массива с помощью фильтра

Arrays.stream(input)
            .filter(inArray->Objects.nonNull(inArray) && inArray.length==2)
            .collect(Collectors.groupingBy(a -> a[0], Collectors.averagingDouble(a -> Double.parseDouble(a[1]))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...