查找列表中某个值的所有索引[重复]

问题描述 投票:0回答:3

我正在尝试搜索

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?
}

如何获取与搜索字符串匹配的所有索引?

java list arraylist
3个回答
2
投票

说明

方法

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());
    

1
投票
您可以查看整个列表并保存与搜索词匹配的所有索引。 Java 8 的 steam 为您提供了一种非常优雅的方式来做到这一点:

int[] indexes = IntStream.range(0, names.size()) .filter(i -> names.get(i).equals(search)) .toArray();
    

0
投票
for (int i = 0;i<author.size();i++){ if(author.get(i).equals(searchTerm)) { System.out.println("Author found!"); System.out.println(i); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.