逆順処理を効率化するテクニック集
では「逆順処理を効率化するためのテクニック」を整理してみます。
1. コピーせずにビューを作る
- 問題:
Collections.reverse(list)はリストを直接並べ替えるため、元の順序が壊れる。 - 解決:
Collections.unmodifiableListとCollections.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 → 最新データだけ欲しいときに高速化
💡 実務では「全件を逆順に処理する」のか「最新だけ欲しい」のかで最適解が変わります。
必要最小限の処理で済ませるのが効率化の最大のポイントです。


