Java | 逆順処理でよくあるバグ集

Java Java
スポンサーリンク

逆順処理を効率化するテクニック集

では「逆順処理を効率化するためのテクニック」を整理してみます。


1. コピーせずにビューを作る

  • 問題: Collections.reverse(list) はリストを直接並べ替えるため、元の順序が壊れる。
  • 解決: Collections.unmodifiableListCollections.reverseOrder を組み合わせてビューを作る。
List<String> list = List.of("A", "B", "C");
List<String> reversed = new ArrayList<>(list);
Collections.reverse(reversed); // コピーを逆順に
Java

👉 元のリストを壊さずに逆順ビューを利用できる。


2. LinkedList の descendingIterator() を活用

LinkedList<String> list = new LinkedList<>(List.of("A", "B", "C"));
for (Iterator<String> it = list.descendingIterator(); it.hasNext();) {
    System.out.println(it.next());
}
Java
  • メリット: コピー不要、逆順イテレーションが O(1) で可能。
  • 実務: 履歴やログの逆参照に便利。

3. Deque の両端操作

Deque<String> deque = new ArrayDeque<>(List.of("A", "B", "C"));
while (!deque.isEmpty()) {
    System.out.println(deque.pollLast()); // 後ろから取り出す
}
Java
  • メリット: 逆順処理が自然にできる。
  • 実務: スタックや履歴処理に最適。

4. Stream で効率的に逆順処理

List<String> list = List.of("A", "B", "C");

IntStream.range(0, list.size())
         .map(i -> list.size() - 1 - i) // インデックスを逆順に変換
         .mapToObj(list::get)
         .forEach(System.out::println);
Java
  • メリット: コピー不要、宣言的に書ける。
  • 実務: データ変換やフィルタ処理と組み合わせやすい。

5. 最新データだけ欲しい場合は break

for (int i = list.size() - 1; i >= 0; i--) {
    if (isValid(list.get(i))) {
        System.out.println("最新の有効データ: " + list.get(i));
        break; // 1件見つけたら終了
    }
}
Java
  • メリット: 全件を逆順に処理せず、効率的に最新を取得できる。
  • 実務: 最新ログや最新設定値の検索。

まとめ

  • コピーせずにビューを作る → 元のリストを壊さない
  • LinkedList / Deque → 逆順処理に強い構造を活用
  • Stream → 宣言的で効率的
  • break → 最新データだけ欲しいときに高速化

💡 実務では「全件を逆順に処理する」のか「最新だけ欲しい」のかで最適解が変わります。
必要最小限の処理で済ませるのが効率化の最大のポイントです。

タイトルとURLをコピーしました