Java LinkedList indexOf() メソッド
indexOf()メソッドは Java のLinkedListLinkedList クラスが提供する一般的なメソッドで、指定した要素がリンクリスト内で最初に出現する位置を検索します。このメソッドはjava.util.LinkedListクラスであり、継承元のjava.util.AbstractListクラスです。
メソッドの構文:
public int indexOf(Object o)
戻り値:
- 指定した要素がリンクリスト内で最初に出現するインデックスを返します(0 から数えます)
- リンクリストにその要素が含まれない場合は -1 を返します
引数の説明
| 引数 | 型 | 説明 |
|---|---|---|
| o | Object | リンクリスト内で検索する要素 |
注意事項
- 引数は任意のオブジェクト型にできます。これには
null - 検索時には
equals()メソッドを使用して要素を比較します - リンクリストに同一の要素が複数含まれる場合、最初に一致した要素のインデックスのみを返します
使用例
基本例
例
import java.util.LinkedList;
public class LinkedListIndexOfExample {
public static void main(String[] args) {
// LinkedList を作成する
LinkedList<String> fruits = new LinkedList<>();
// 要素を追加する
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
fruits.add("Banana"); // 重複する要素
// 要素のインデックスを検索する
System.out.println("Index of 'Banana': " + fruits.indexOf("Banana")); // 出力: 1
System.out.println("Index of 'Grape': " + fruits.indexOf("Grape")); // 出力: -1
System.out.println("Index of 'Orange': " + fruits.indexOf("Orange")); // 出力: 2
}
}
public class LinkedListIndexOfExample {
public static void main(String[] args) {
// LinkedList を作成する
LinkedList<String> fruits = new LinkedList<>();
// 要素を追加する
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
fruits.add("Banana"); // 重複する要素
// 要素のインデックスを検索する
System.out.println("Index of 'Banana': " + fruits.indexOf("Banana")); // 出力: 1
System.out.println("Index of 'Grape': " + fruits.indexOf("Grape")); // 出力: -1
System.out.println("Index of 'Orange': " + fruits.indexOf("Orange")); // 出力: 2
}
}
null 要素の処理
例
import java.util.LinkedList;
public class NullIndexOfExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add(null);
list.add("B");
System.out.println("Index of null: " + list.indexOf(null)); // 出力: 1
}
}
public class NullIndexOfExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add(null);
list.add("B");
System.out.println("Index of null: " + list.indexOf(null)); // 出力: 1
}
}
実装原理
内部実装
LinkedListのindexOf()メソッドはリンクリストのノードを走査して要素を検索します:
- リンクリストの最初のノード(先頭ノード)から走査を開始します
- 各ノードについて、
equals()メソッドで要素を比較します - 最初に一致するノードを見つけたら、現在のインデックスを返します
- すべてのノードを走査しても見つからない場合は -1 を返します
時間計算量
- 平均時間計算量:O(n)
- 最悪時間計算量:O(n)
なぜならLinkedListLinkedList はリンクリストベースで実装されているため、先頭から順に検索する必要があり、配列のようにランダムアクセスはできません。
関連メソッドとの比較
indexOf() vs lastIndexOf()
| メソッド | 説明 | 検索方向 |
|---|---|---|
| indexOf() | 要素が最初に出現する位置を返す | 先頭から末尾まで |
| lastIndexOf() | 要素が最後に出現する位置を返す | 末尾から先頭まで |
indexOf() vs contains()
| メソッド | 戻り値 | 用途 |
|---|---|---|
| indexOf() | int(インデックス位置) | 要素の位置を知る必要がある場合に使用する |
| contains() | boolean | 要素が存在するかどうかのみを知る必要がある場合に使用する |
実際には、contains()メソッドの内部ではindexOf() >= 0を呼び出して実装されています。
実際の適用シナリオ
シナリオ 1:要素が存在するかどうかの確認
例
LinkedList<String> usernames = new LinkedList<>();
// ... ユーザー名を追加
String input = "admin";
if (usernames.indexOf(input) != -1) {
System.out.println("ユーザー名は既に存在します");
} else {
System.out.println("登録できます");
}
// ... ユーザー名を追加
String input = "admin";
if (usernames.indexOf(input) != -1) {
System.out.println("ユーザー名は既に存在します");
} else {
System.out.println("登録できます");
}
シナリオ 2:要素の位置を取得して後続の操作を行う
例
LinkedList<Task> taskList = new LinkedList<>();
// ... タスクを追加
int index = taskList.indexOf(importantTask);
if (index != -1) {
// 重要なタスクの前に新しいタスクを挿入
taskList.add(index, newUrgentTask);
}
// ... タスクを追加
int index = taskList.indexOf(importantTask);
if (index != -1) {
// 重要なタスクの前に新しいタスクを挿入
taskList.add(index, newUrgentTask);
}
シナリオ 3:データの重複除去
例
LinkedList<String> listWithDuplicates = new LinkedList<>();
// ... 重複する可能性のあるデータを追加
LinkedList<String> uniqueList = new LinkedList<>();
for (String item : listWithDuplicates) {
if (uniqueList.indexOf(item) == -1) {
uniqueList.add(item);
}
}
// ... 重複する可能性のあるデータを追加
LinkedList<String> uniqueList = new LinkedList<>();
for (String item : listWithDuplicates) {
if (uniqueList.indexOf(item) == -1) {
uniqueList.add(item);
}
}
注意事項
- パフォーマンスの考慮事項:頻繁な検索操作の場合、
ArrayListのindexOf()通常はLinkedListより高速です - 要素の比較:格納されていることを確認してください
LinkedList内のオブジェクトが正しく実装していることを確認してくださいequals()メソッド - 並行変更:反復処理中にリンクリストを変更すると、例外がスローされる可能性があります
ConcurrentModificationException - null の処理:検索できます
null要素ですが、注意が必要ですNullPointerExceptionリスク
まとめ
LinkedListのindexOf()このメソッドは実用的な検索ツールであり、次のような特徴があります:
- シンプルで使いやすく、検索する要素を渡すだけでよい
- 要素が最初に出現する位置のインデックスを返す
- 見つからない場合は -1 を返す
- さまざまなオブジェクト型に適用でき、これには
null
このメソッドを理解し、使いこなすことで、リンクリスト内のデータ検索をより効率的に処理できます。
その他の拡張