AI作成・独立検証済(有資格者監修なし)1Z0-829 対応
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 }
  1. A{a=2, b=2, c=1}
  2. B{a=[apple, avocado], b=[banana, blueberry], c=[cherry]}
  3. C{a=2, b=2, c=1} だが値の型は Integer
  4. 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) の場合。
  • Ccounting() の戻りは Long。マップは Map<Character, Long> で、値は Integer ではない(表示は同じ 2/1 でも型が違う)。
  • D分類関数は s.charAt(0)(先頭文字)であり文字列長ではない。長さでの分類は s.length() を渡した場合。
ひっかけ: counting() の戻り型は LongInteger ではない)。また groupingBy の既定マップは HashMapで反復順は本来保証されないが、単一小文字キーではハッシュ=文字コードのため実質アルファベット順に見える(順序を保証したい場合は groupingBy(fn, TreeMap::new, downstream))。
実機確認の答え合わせ
出力:
{a=2, b=2, c=1}
公式ドキュメント・関連Collectors.groupingBy(SE17 API)
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
この分野をもっと解いて、得点源に
Collectors を含む問題を分野別に演習できます。
演習する →