簡體   English   中英

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

[英]Faster way to find index of String in ArrayList

所以我有這樣的事情:

List<String> test = new ArrayList<String>();

當我打印時,我有:

"[ABC, DEF, GHI, JKL]"

我想搜索例如“ E”的索引。 我是這樣做的:

for (String a : test) {
   if(a.contains("E")) {
      System.out.println(test.indexOf(a));
   }
}

有更快的方法嗎? 因為現在evrytime在所有列表中都使用“ for”。

假設您已經說過要在列表中找到包含“ E”的第一項,那么根據定義,您將不得不遍歷每一項以檢查它們,直到找到匹配項為止-這可能在列表的末尾,因此在最壞的情況下,您仍然必須搜索整個列表。

但是,您可以采取的一種捷徑是至少在找到感興趣的捷徑后立即退出循環:

for (String a : test) {
   if(a.contains("E")) {
      System.out.println(test.indexOf(a));
      break;
   }
}

如果要搜索完整的字符串(例如“ ABC”),則可以使用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() parallelStream()來提高速度-此Java 8代碼可能執行與代碼相同的操作次數,但是可以在多個CPU內核上並行運行傳統的for循環不是。

另外,如果您確實確實需要立即訪問所需元素的方式,並且所要查找的條件始終相同(即,您始終只需要包含“ E”的元素),則可以在其他數據結構(例如地圖)中跟蹤數據。 例如,每次將項目添加到包含所需條件的列表中時,也將其添加到地圖中。 就像是:

Map<String, List<String>> mapOfValuesICareAbout = new HashMap<>();
String newValue = "GFE";
if (newValue.contains("E")) {
    mapOfValuesICareAbout.get("E").add(newValue);
}
list.add(newValue);

您可以使用排列索引 ,通常用於單詞:

["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的字符串,都有N,N-1,...,2、1個字符的right值。

class SearchBase {
    private List<Entry> entries; // Or immediately sorted: TreeSet

    void addAll(String... terms) {
        fill list entries, and sort them
    }

    Collection<String> termsContaining(String sought) {
        binary search on entries rigth
    }
}

如果只希望包含字母'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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM