web-dev-qa-db-ja.com

ArrayListでアイテムのインデックスを見つけるより良い方法は?

Androidアプリの場合、次の機能があります

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

それは、要素の位置を取得するための関数を記述する「最良の」方法ですか?または、Javaに空想的なネイティブ関数がありますか?

77
Jacksonkr

ArrayListには indexOf()メソッド があります。 APIの詳細を確認してください。ただし、次のように機能します。

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf()は、メソッドが返すものを正確にすばやく返します。

176
Jon Egeland
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

出力:リストインデックス:7

Hを渡すと7を返します。Jを渡すと-1を返しますデフォルト値を-1に定義したため。

完了

14
Hiren Patel

Listがソートされており(ArrayListがそうであるように)ランダムアクセスに優れている場合は、Collections.binarySearchを調べる必要があります。それ以外の場合は、他の人が指摘したように、List.indexOfを使用する必要があります。

しかし、あなたのアルゴリズムは健全で、fwiw(==他が指摘している以外)です。

6
yshavit

Javaには、実際に活用すべき派手なネイティブ関数があります。

ArrayListには、というインスタンスメソッドがあります

indexOf(Object o)

(http://docs.Oracle.com/javase/6/docs/api/Java/util/ArrayList.html)

次のように_categoriesで呼び出すことができます。

_categories.indexOf("camels")

Androidのプログラミングの経験はありませんが、これは標準のJavaアプリケーションでは機能します。

がんばろう。

3
klyngbaek

Java APIは、使用可能な2つのメソッドindexOf(Object obj)およびlastIndexOf(Object obj)を指定します。最初の要素は、見つかった場合は要素のインデックスを返し、見つからなかった場合は-1を返します。 2番目は最後のインデックスを返します。これはリストを逆方向に検索するようなものです。

2
danca