1. [3,1,4,1,5,9,2,6] を昇順 + カンマ区切りで連結
  2. 空配列は空文字列を返す
  3. 要素 1 個ならその数字をそのまま文字列で返す
  4. 既に昇順なら順番を変えずに連結する
  5. 降順の入力を昇順に並べ替える
  6. 負の数を含む入力でも昇順に並べる
  7. 全要素が同じでも順番を保って連結する
コース一覧
Java 中級:コレクション・Stream・例外処理
sorted で並び替え

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

sorted で並び替え

並べ替えたら、呼び出し元のリストまで並んでいた

リストを並べ替えるとき、まず思いつくのは Collections.sort です。

Java

public static void printRanking(List<Integer> scores) { Collections.sort(scores); System.out.println(scores); }

これは動きますが、scores そのものを並べ替えてしまいます。呼び出した側が「表示してもらっただけ」のつもりでいると、次の行で元の順番を使おうとしたときに、もう元の順番は残っていません。表示のためのメソッドが、渡されたデータを黙って書き換える形になっています。

Stream の sorted() は、この問題が起きません。

Java

List<Integer> ranking = scores.stream().sorted().toList(); System.out.println(scores); // 渡されたときのまま

sorted() は並べ替えた新しい Stream を返すだけで、元のリストには指 1 本触れません。「並んだ結果が欲しい」と「元を並べ替えたい」は別の要求で、前者なら sorted() の方が安全です。

引数なしなら自然順、渡せば好きな順

sorted() を引数なしで呼ぶと、その型が元から持っている順番で並びます。数値なら小さい順、文字列なら辞書順です。これを自然順と呼びます。

自然順で困るのは、自作クラスを並べたいときです。会員をどう並べるべきかは Java には分かりません。そこで、比べ方そのものを渡します。

Java

List<Member> byAge = members.stream() .sorted(Comparator.comparing(m -> m.age)) .toList();

Comparator.comparing には「何で比べるか」を取り出す式を渡します。ここでは年齢を取り出しているので、年齢の小さい順に並びます。大きい順にしたいときは、後ろに .reversed() を付けます。

Java

.sorted(Comparator.comparing(m -> m.age).reversed())

同じ年齢の人の中では名前順にしたい、というときは .thenComparing(...) をつなぎます。比べ方を組み立ててから渡す、という形はどれも同じです。

並べ方を渡さないと、実行時に落ちる

自作クラスの Stream に、引数なしの sorted() を呼んだときが要注意です。

Java

members.stream().sorted().toList(); // ClassCastException

これはコンパイルは通ります。sorted() は自然順があることを前提にしているだけで、コンパイラはその有無を確かめてくれないからです。比べ方を持っていないクラスを並べようとした瞬間、実行時に ClassCastException が出ます。

解説

数値や文字列を並べるときは引数なし、自作クラスを並べるときは Comparator を渡す、と覚えておけば、この例外にはまず出会いません。

やってみよう

Solution.sortedJoined(int[] arr) を完成させて、配列を昇順に並べた , 区切りの文字列を返してください。

Arrays.stream(arr) で IntStream を作り、sorted() で並べ替えます。int の自然順は小さい順なので、引数は要りません。並べ終わったら文字列の Stream に変えて、前の回で使った Collectors.joining(",") でつなぎます。

配列が空のときは空文字列を返します。同じ値が 2 回入っていても取り除く必要はありません。[3, 1, 1] なら 1,1,3 と、1 が 2 つ並んだまま出るのが正解です。

要件

  1. クラス名は Solution、メソッド名は sortedJoined、引数は int[] arr ひとつにすること
  2. 戻り値の型は String で、Stream API の sorted() を使って昇順に並べ替え、, 区切りの 1 つの文字列にして返すこと
  3. 配列が空 (arr.length == 0) のときは空文字列 "" を返すこと

入出力例

sortedJoined([3,1,4,1,5,9,2,6]) → "1,1,2,3,4,5,6,9" sortedJoined([]) → "" sortedJoined([5]) → "5" sortedJoined([1,2,3,4,5]) → "1,2,3,4,5" sortedJoined([9,7,5,3,1]) → "1,3,5,7,9" sortedJoined([-1,-5,0,3,-2]) → "-5,-2,-1,0,3" sortedJoined([7,7,7,7]) → "7,7,7,7"

ヒント

`Arrays.stream(int[])` は `IntStream` を返します。`sorted()` は引数なしで昇順に並べ替えてくれます

`IntStream` から直接 `Collectors.joining` は呼べないので、`mapToObj(String::valueOf)` で `Stream<String>` に変換してから `collect(Collectors.joining(","))` を呼びます

空配列の場合は `Collectors.joining` も `""` を返しますが、意図を明示するために `if (arr.length == 0) return "";` のガードを先頭に書いておくと安全です

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • distinct で重複排除

    Stream の `distinct()` で配列やリストから重複要素を取り除き、ユニークな要素数を集計する書き方を身につけよう。

  • limit と skip

    Stream API の中間操作 limit と skip を使い、要素を先頭から数件だけ取り出したり、先頭の数件を飛ばしたりする方法を学んで、配列のスライス処理を Stream で書いてみよう。

  • 並列ストリーム

    Stream API の parallel() で配列を複数 CPU コアに分割集計させる並列ストリームの仕組みと、結合性・スレッド安全・順序保証など並列化の落とし穴を学びます。

  • Stream API まとめクイズ

    Stream API 章で学んだ生成 / filter / map / reduce / collect / sorted / distinct / limit / skip / parallel を、メソッドチェーンの順序と中間操作・ターミナル操作の使い分けで総ざらいする 4 択クイズ。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • リスト順序付きで複数の値を扱うデータ構造
  • メソッドクラスに属する関数
  • 引数位置引数=順番で渡す。
  • クラスデータと振る舞いを束ねる単位
  • コンパイルソースをバイトコードへ変換する処理
  • 配列サイズ固定の同型データの集まり
  • 戻り値呼び出し元への返答を表す点線矢印
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
main.java
学習モード
エディタを読み込んでいます

メモ

sorted で並び替え

⌘S で保存