3

検索を開始する最初の項目を指定するjava.util.Listを検索するための組み込みメソッドはありますか?文字列でできるように

自分で簡単に何かを実装できることはわかっていますが、Javaまたはhttp://commons.apache.org/collections/api-release/org/apache/commons/collections/package-summaryの場合は、車輪の再発明をしたくありません。 .htmlにはすでにそれがあります。

私はこれをどのように実装するかを尋ねているのではなく、何かがすでに利用可能かどうかを尋ねています。ここでの提案の多くはバグがありました。

誰かが正しい答えのクレジットを受け取ることを気にかけている場合は、答えを更新して、それを行うための組み込みの方法がないことを伝えてください(確かに知っている場合)

これが私がやりたいことです

List<String> strings = new ArrayList<String>();
// Add some values to the list here
// Search starting from the 6th item in the list
strings.indexOf("someValue", 5);

今使っています

/**
 * This is like List.indexOf(), except that it allows you to specify the index to start the search from
 */
public static int indexOf(List<?> list, Object toFind, int startingIndex) {
    for (int index = startingIndex; index < list.size(); index++) {
        Object current = list.get(index);
        if (current != null && current.equals(toFind)) {
            return index;
        }
    }
    return -1;
}

そして私はそれを次のように実装しました

public static int indexOf(List<?> list, Object toFind, int startingIndex) {
    int index = list.subList(startingIndex).indexOf(toFind);
    return index == -1 ? index : index + startingIndex;
}
4

4 に答える 4

13

単一の方法ではありませんが、1 ~ 2 行のコードでこれを行う簡単な文書化された方法があります。このメソッドのドキュメントにもそう書かれています:

strings.subList(5, strings.size()).indexOf("someValue");

そのサブリストを保持するかどうかなどに応じて、結果に 5 を追加する可能性があります (-1 でない場合)。

int result = list.subList(startIndex, list.size()).indexOf(someValue);
return result== -1 ? -1 : result+startIndex;

注: 新しい を作成するのでsubListなくList、元のビューを作成するだけです。

于 2012-06-07T19:16:25.937 に答える
4

sublist次のように使用できます。

List<String> strings = new ArrayList<String>();
// Add values ...
int start = 5;
int pos = strings.sublist(start, strings.size()).indexOf("someValue");
// Don't forget to add the starting point back
if (pos >= 0) pos += start;
于 2012-06-07T19:16:21.927 に答える
2

より一般的なアプローチについては、次の方法を試してください。

public static int indexOf(List<?> list, int start, Object value) {
    int idx = list.subList(start, list.size()).indexOf(value);
    return idx != -1 ? idx + start : -1;
}

-1要素が見つからない場合に戻り、任意のタイプのリストに対して機能します。次のように使用します。

List<String> strings = Arrays.asList("a", "b", "c", "a", "b", "c");
int idx = indexOf(strings, 2, "a");
System.out.println(idx);
> 3
于 2012-06-07T19:17:19.613 に答える
1

次のようにsubList(int from, int to)と を組み合わせて使用​​できます。indexOf

int pos = strings.subList(5, strings.size()).indexOf("someValue");
if (pos >= 0) {
    pos += 5;
}
于 2012-06-07T19:21:20.223 に答える