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


89

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の派手なshmancyネイティブ関数はありますか?


2
このコードには欠陥がある可能性があります。を使用すると==、ほとんどの場合、誤った結果が生成されます。

3
文字列を「==」と比較することはできません。String.equals(Stringstr)を使用する必要があります
MrZander 2011

5
@MrZander確かにあなたはそれらを比較することができます==...それはちょうど正しい種類の比較ではありません

私はまだJavaに慣れString.equalsてい===ないことがわかります。JavaScriptのような言語でのようになりますか?例えば。値とタイプをチェックしますか?
Jacksonkr 2011

3
いいえ。 ==オブジェクトIDであり、「同じオブジェクトである」という意味です。(このビューは、値が42またはchar'x 'などの数値が1つしかない場合、参照型だけでなくプリミティブ値にも当てはまります)。Object.equalsはすべてのオブジェクトインスタンスに対して定義された仮想メソッドであり、すべてのクラスタイプがObjectを拡張するため、「同じ値を持つ」ことを意味し、すべてのオブジェクト等価性テストに使用する必要があります。カバー==対には多くの質問がありObject.equals、これは理解するための非常に重要な概念です!たとえば、これは誤りです"hello" == new String("hello")。ドー!

回答:


192

ArrayList持っているindexOf()方法を。詳細についてはAPIを確認してください。ただし、その仕組みは次のとおりです。

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

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

indexOf() メソッドが返すものを正確に高速に返します。


3
投稿されたコードよりも複雑さの点で「高速」ではありませんが、より効率的に実装される可能性があります。また、indexOfの反応はここでは少し異なります。元のコードは[誤って]使用しますが==、indexOfはを使用しequals()ます。

実際、nullを個別に処理するif-elseブランチで開始することを除いて、(少なくとも私が持っているSun Java 6コードでは)ほぼ同じコードです。
yshavit 2011

有線の古い配列であり、List <>にはFindIndex()メソッドがありますが、ArrayListの途中でAPIが変更されます:D
boctulus 2014

16
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が返されます。

完了


私は万力その逆、こののを作ることができますどのように、あなたの解決のために、あなたの入力があるH 、あなたはの位置を取得 Hを私の入力がの指数であれば、仮定7私はそのインデックスの文字列値を得ることができる方法。ありがとう
JimaleAbdi19年

1
@JimaleAbdi yourArrayList.get(7)を実行します。7はあなたの立場です。
HirenPatel19年

6

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

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


3

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

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

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

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

_categories.indexOf("camels")

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

幸運を。


1
ネイティブ関数は私にはC \ C ++を意味します。
ハンターマクミレン2011

3

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


1

リスト内のアイテムの位置を見つける最良の方法は、コレクションインターフェイスを使用することです。

例えば、

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

出力:2


1

indexOf()メソッドを使用して、コレクション内の要素の最初の出現を検索します。


0

ここでの最良の解決策

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map { x->x.Id }.indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.