Collectors(groupingBy + counting)難易度 標準無料
次のコードの出力として正しいものを選べ。
1 import java.util.*;
2 import java.util.stream.*;
3 public class Q5 {
4 public static void main(String[] a) {
5 Map<Character, Long> m = Stream
6 .of("apple", "banana", "avocado", "cherry", "blueberry")
7 .collect(Collectors.groupingBy(
8 s -> s.charAt(0),
9 Collectors.counting()));
10 System.out.println(m);
11 }
12 }
- A
{a=2, b=2, c=1} - B
{a=[apple, avocado], b=[banana, blueberry], c=[cherry]} - C
{a=2, b=2, c=1}だが値の型はInteger - D
{5=1, 6=2, 7=1, 9=1}(文字列長で分類される)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
Collectors.groupingBy(classifier, downstream) は、分類関数(classifier)でキーを決め、同じキーの要素群に対して下流コレクタ(downstream)を適用する。
分類キーは「先頭文字」s.charAt(0)。下流は Collectors.counting()(件数を Long で数える)。
'a'… apple, avocado → 2'b'… banana, blueberry → 2'c'… cherry → 1
結果は {a=2, b=2, c=1}。groupingBy の戻りは既定で HashMap で、
これら1文字('a'=97, 'b'=98, 'c'=99)はバケット位置が昇順に並ぶため表示も a, b, c の順になる。
- B下流に
counting()を指定しているので値は件数。リストになるのは下流を省略したgroupingBy(classifier)の場合。 - C
counting()の戻りはLong。マップはMap<Character, Long>で、値はIntegerではない(表示は同じ 2/1 でも型が違う)。 - D分類関数は
s.charAt(0)(先頭文字)であり文字列長ではない。長さでの分類はs.length()を渡した場合。
ひっかけ:
counting() の戻り型は Long(Integer ではない)。また groupingBy の既定マップは HashMapで反復順は本来保証されないが、単一小文字キーではハッシュ=文字コードのため実質アルファベット順に見える(順序を保証したい場合は groupingBy(fn, TreeMap::new, downstream))。実機確認の答え合わせ
出力:
{a=2, b=2, c=1}公式ドキュメント・関連Collectors.groupingBy(SE17 API)↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)