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 回答