我正在尝试搜索
ArrayList
来查找用户输入。我已成功创建一个搜索,打印列表中第一次出现的索引。
我在尝试获取该项目存储的其余索引时遇到问题。
这是我迄今为止打印
search
的第一个索引的代码:
if (names.contains(search)) {
System.out.println("name found!");
System.out.println(names.indexOf(search));
}
我知道需要添加一个循环。但我在尝试表述它时遇到了困难。
ArrayList<String> names = new ArrayList<String>();
names.add("Bob");
names.add("Jerry");
names.add("Bob");
names.add("Mick");
说
search = "Bob"
。 我的预期结果是{0,2}
。 相反,我只能获取第一次出现的索引 (0
)。
assert allIndexesOf(names, "Bob").equals(List.of(0, 2));
[...]
private List<Integer> allIndexesOf(List<?> list, Object o) {
// How can this be implemented?
}
如何获取与搜索字符串匹配的所有索引?
方法
List#indexOf
仅返回第一个找到的匹配元素的索引。来自其文档:
返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。 [...]但是你想要
全部,因此你还需要迭代所有元素。
另请注意,调用List#contains
是不必要的,因为
List#indexOf
也回答了这个问题,如果没有找到,它会返回
-1
。事实上,在
ArrayList
中,这两个调用都非常昂贵(它们从左到右迭代直到找到),因此如果它们如此昂贵,您不应该使用不必要的语句。
ArrayList<String> author = ...
String needle = ...
// Collect matches
List<Integer> matchingIndices = new ArrayList<>();
for (int i = 0; i < author.size(); i++) {
String element = author.get(i);
if (needle.equals(element)) {
matchingIndices.add(i);
}
}
// Print matches
matchingIndices.forEach(System.out::println);
或者您可以使用
Stream API的一些非常方便的方法。 Stream#filter
(文档)例如:
List<Integer> matchingIndices = IntStream.range(0, author.size())
.filter(i -> needle.equals(author.get(i))) // Only keep those indices
.collect(Collectors.toList());
int[] indexes =
IntStream.range(0, names.size())
.filter(i -> names.get(i).equals(search))
.toArray();
for (int i = 0;i<author.size();i++){
if(author.get(i).equals(searchTerm)) {
System.out.println("Author found!");
System.out.println(i);
}
}