我有一个arraylist Arraylist<String[]>
,我试图找到一种快速查找String[]
特定索引的特定值的方法。我的ArrayList
总是包含长度为String[]
的长度2.而我想要做的是查看具有特定值ArrayList
的{{1}} String[]
str[1]="value"
1}}。我知道我可以遍历ArrayList
获取每个元素(String[]
),然后使用str[1].equals("value")
查找值,但我想知道是否有更快的方法来执行此操作可能使用contains()
的{{1}}或其他内容。
感谢
PS:我不知道我的数组的第一个元素(ArrayList
)的值,所以我无法构造一个新的str[0]
并检查String[]
是否包含
答案 0 :(得分:1)
如何使用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);
如果您始终保持al
和alIndexMap
同步,则您始终知道al
中您要查找的数组的位置。< / p>
Google的 Guava 有一些实现其BiMap
界面的课程。它与Map
类似,但它可以双向运行,例如,如果您愿意,可以将value
用作key
。
答案 1 :(得分: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());
答案 2 :(得分:0)
除非您的ArrayList已排序,否则O(n)效率是您可以做的最佳效果。除非通过&#34;快速方式&#34;你的意思是一种为你做迭代的方法。即使在这种情况下答案也是肯定的,因为您想要检查String []对象本身内部的数据。