所以我有这样的事情:
List<String> test = new ArrayList<String>();
当我打印它时,我有:
"[ABC, DEF, GHI, JKL]"
我想搜索&#34; E&#34;的示例索引。我是这样做的:
for (String a : test) {
if(a.contains("E")) {
System.out.println(test.indexOf(a));
}
}
有更快的方法吗?因为现在我正在制作&#34;因为#34;在所有名单上。
答案 0 :(得分:0)
鉴于您已经说过想要在列表中找到包含&#34; E&#34;的第一项,根据定义,您必须遍历每个项目以检查它们,直到找到匹配项为止 - 这可能在列表的末尾,所以在最坏的情况下你仍然需要搜索整个列表。
但是,您可以采取的一个捷径是,一旦找到您感兴趣的循环,就至少退出循环:
for (String a : test) {
if(a.contains("E")) {
System.out.println(test.indexOf(a));
break;
}
}
如果您正在搜索完整的字符串(例如&#34; ABC&#34;),您可以使用indexOf
,但是当您正在搜索部分匹配时,您无法做到此
Java 8语法,虽然不太可能提高性能或在较少的代码行中执行操作,但可以说更具可读性,并且允许您链接其他流操作以对符合您的项目执行任何操作查询:
List<String> list = Arrays.asList("ABC", "DEF", "GHI", "JKL");
Optional<String> matchingItem = list.stream()
.filter(s -> s.contains("E"))
.findFirst();
matchingItem.ifPresent(s -> System.out.println(list.indexOf(s)));
Java 8确实包含对此类操作的优化。
顺便提一下,如果您的列表非常大,您可以使用parallelStream()
代替stream()
来提高速度 - 这个Java 8代码可能会执行与您的代码相同的操作数,但它可以在多个CPU内核上并行执行,而传统的for循环不是。
或者,如果您确实需要立即访问所需元素的方法,并且您要查找的条件始终相同(即,您始终只需要包含&#34; E&#34;),您可以跟踪其他数据结构中的数据,如地图。例如。每次将项目添加到包含所需条件的列表时,也会将其添加到地图中。类似的东西:
Map<String, List<String>> mapOfValuesICareAbout = new HashMap<>();
String newValue = "GFE";
if (newValue.contains("E")) {
mapOfValuesICareAbout.get("E").add(newValue);
}
list.add(newValue);
答案 1 :(得分:0)
您可以使用置换索引,通常用于单词:
["he speaks well", "well done"]
会给出一个排序列表
well *done*
*he* speaks well
he *speaks* well
he speaks *well*
*well* done
你可以快速找到“好”。
在我们的案例中,这样的列表条目将是:
class Entry implements Comparable<Entry> {
String right;
String left;
@Override
public String toString() { return left + "^" + right; }
}
对于长度为N的每个字符串,有{,1-1}个N,N-1,...,2,1个字符的值。
right
答案 2 :(得分:0)
如果您只想要包含字母“E”的第一个元素的索引,则只能使用String#indexOf(char)
来保留一个操作。找到元素后,您可以摆脱循环。
List<String> test = Arrays.asList("ABC", "DEF", "GHI", "JKL");
for (String element : test) {
int idx = element.indexOf('E');
if (idx != -1) {
System.out.println(element + " with 'E' at pos: " + idx);
break;
}
}