是否有内置方法来搜索java.util.List,指定开始搜索的第一个项目?就像你可以使用Strings
一样我知道我可以自己轻松实现某些功能,但如果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;
}
答案 0 :(得分:13)
不是没有一种方法,但有一个简单的记录方法,使用1-2行代码。它甚至说in the documentation for this method:
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
,只是查看原始的{{1}}。
答案 1 :(得分: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;
答案 2 :(得分: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
答案 3 :(得分:1)
您可以使用subList(int from, int to)
和indexOf
的组合,如下所示:
int pos = strings.subList(5, strings.size()).indexOf("someValue");
if (pos >= 0) {
pos += 5;
}