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

Java Java
スポンサーリンク

逆順処理に適したデータ構造の比較

了解です!では「逆順処理を効率化するためのデータ構造選び」を整理してみます。


データ構造特徴逆順処理のしやすさ実務での利用シーン
ArrayList配列ベース、ランダムアクセスが高速for (int i = size-1; i >= 0; i--) で簡単に逆順可能一般的なリスト処理、インデックスが必要な場合
LinkedList双方向リンク、要素の挿入・削除が高速descendingIterator() で逆順イテレーション可能キュー/デック処理、頻繁な挿入削除がある場合
StackLIFO(後入れ先出し)専用構造pop() で自然に逆順処理Undo/Redo、履歴管理
Deque (ArrayDeque)両端キュー、スタック/キュー両方の用途に対応pollLast()descendingIterator() で逆順処理双方向の処理、バッファ、タスク管理

具体例

1. ArrayList の逆順処理

List<String> list = new ArrayList<>(List.of("A", "B", "C"));
for (int i = list.size() - 1; i >= 0; i--) {
    System.out.println(list.get(i));
}
Java

👉 ランダムアクセスが速いので逆順ループに最適。


2. LinkedList の逆順処理

LinkedList<String> list = new LinkedList<>(List.of("A", "B", "C"));
for (Iterator<String> it = list.descendingIterator(); it.hasNext();) {
    System.out.println(it.next());
}
Java

👉 descendingIterator() が用意されているので自然に逆順処理できる。


3. Stack の逆順処理

Stack<String> stack = new Stack<>();
stack.push("A");
stack.push("B");
stack.push("C");

while (!stack.isEmpty()) {
    System.out.println(stack.pop()); // C, B, A
}
Java

👉 スタックは「逆順処理」が本来の使い方。


4. Deque の逆順処理

Deque<String> deque = new ArrayDeque<>(List.of("A", "B", "C"));
for (Iterator<String> it = deque.descendingIterator(); it.hasNext();) {
    System.out.println(it.next());
}
Java

👉 Deque はスタック/キュー両方の用途に対応できる万能型。


まとめ

  • ArrayList → インデックスを使った逆順処理に最適
  • LinkedListdescendingIterator() で逆順が簡単
  • Stack → 逆順処理が自然にできる(LIFO構造)
  • Deque → 双方向処理や柔軟な用途に対応

💡 実務では「単純に逆順に走査したい → ArrayList」「履歴やUndo処理 → Stack」「双方向に処理したい → Deque」「挿入削除が多い → LinkedList」と使い分けるのがベストです。

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