在ArrayList中查找String索引的更快方法

时间:2015-08-11 09:53:58

标签: java list indexof

所以我有这样的事情:

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;在所有名单上。

3 个答案:

答案 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;
    }
}