2015-11-19 96 views
0

我有一個arraylist Arraylist<String[]>我試圖找到一個快速的方式來尋找一個特定的索引String[]的特定值。我的ArrayList總是會包含長度爲2的String[]。而我想要做的是通過ArrayList查看具有特定值的任何String[],即str[1]="value"。我知道我可以遍歷ArrayList對每一個元素(String[])進行迭代,然後使用str[1].equals("value")查找值,但我想知道是否有更快的方法來完成它,可能使用或ArrayList或其他。 感謝快速的方式來搜索arrayList

PS:我不知道我的數組(str[0])的第一個元素的值,所以我不能構建一個新的String[]並檢查ArrayList包含

+0

嘗試重新考慮你的數據結構來改善你想好了,如果做在同一 – shiladitya

+4

操作你的'的String []'只長'2',你是把它們放入一個'ArrayList'爲什麼不只是把所有這些變成一個'Map '?我認爲這會解決你的問題 – 3kings

+0

我想我應該這樣做@ 3kings。但即使使用這種方法,我會怎麼做? 'ArrayList'和'Map'都有辦法查看裏面是否有特定的元素,但是如何將它們結合起來而不必迭代ArrayList呢? – Rakim

回答

0

除非你的ArrayList進行排序,然後Ø (n)效率是你能做的最好的。除非通過「快捷方式」,否則你的意思是一種爲你迭代的方法。即使在這種情況下,答案是否定的,因爲你想檢查String []對象本身內的數據。

+1

是的,我的意思是在分揀機的代碼方面更快。但正如你所說......依然! – Rakim

1

LinkedHashMap的

如何使用LinkedHashMap<String, String[]>代替ArrayList的?關鍵將是String[1]值。 Linked因爲這會給你預測的迭代次序。

輔助地圖

或者你可以創建一個Map<String, Integer>其中關鍵是String[1]值和值是您String[]ArrayList索引。

ArrayList<String[]> al = new ArrayList<>(); 
Map<String, Integer> alIndexMap = new HashMap<>(); 
// ... 
Integer nextIndex = al.size(); 
al.add(someStringArray); 
alIndexMap.put(someStringArray[1], nextIndex); 

如果你保持alalIndexMap在同步的時候,你總是知道在哪裏al是,你要尋找的陣列。

番石榴BIMAP

谷歌的番石榴有實現自己BiMap接口部分班級。它就像是一個Map,但它可以兩種方式工作,即如果需要,您可以使用value作爲key

+0

感謝您的回覆。我已經檢查過「BiMap」,但是因爲它是針對Uni項目的,所以我打算使用最少量的依賴關係,因此並不想真正使用Guava。至於上述解決方案,我仍然試圖圍繞你的想法努力工作。不是真的和你在一起:p – Rakim

1

如果你看看ArrrayList#contains - 你會看到,這個方法也遍歷所有元素。

你可以使用parallelStream - 這樣ArrayList可以被更多的線程搜索。

List<String[]> listToSearchIn = new ArrayList<String[]>(); 

    List<String[]> matches = listToSearchIn.parallelStream() 
      .filter((element) -> element[1].equals("value")) 
      .collect(Collectors.toList()); 
+0

再次抱歉。我的標題可能是誤導性的。通過「快速」我的意思是「少編碼」而不是「少迭代」。也許我應該重新格式化我的標題 – Rakim

+0

好吧,如果你可以使用Java 8,那麼這只是上面的一行。 (你也可以使用普通的stream()) – burna

+0

我會看看它:)謝謝 – Rakim