【问题标题】:Quick way to search through arrayList快速搜索arrayList的方法
【发布时间】:2016-02-21 18:45:42
【问题描述】:

我有一个数组列表Arraylist<String[]>,我正在尝试找到一种在String[] 的特定索引上查找特定值的快速方法。我的ArrayList 总是包含长度为 2 的String[]。我想做的是通过ArrayList 查找具有特定值的任何String[],即str[1]="value"。我知道我可以遍历ArrayList 获取每个元素(String[]),然后使用str[1].equals("value") 查找值,但我想知道是否有更快的方法可以使用contains() ArrayList 什么的。 谢谢

PS:我不知道我的数组的第一个元素 (str[0]) 的值,所以我无法构造一个新的 String[] 并检查 ArrayList 是否包含它

【问题讨论】:

  • 尝试重新考虑您的数据结构以改进您尝试在同一数据上执行的操作
  • 好吧,如果您的String[] 的长度只有2,而您将它们放入ArrayList,为什么不将所有这些都更改为Map<Key,Value>?我想这会解决你的问题
  • 我想我应该这样做@3kings。但即使使用这种方法,我该怎么做呢? ArrayListMap 都有办法查看内部是否有特定元素,但是我如何将它们组合起来而不必遍历 ArrayList
  • 顺便说一句,我使用 String[] 而不是 HashMap<String, String> 的原因是因为我想要一个双向结构。在Map 上,我无法使用值获取密钥
  • @Rakim 那为什么不把value 变成key呢?

标签: java arraylist contains


【解决方案1】:

除非您的 ArrayList 已排序,否则 O(n) 效率是您能做到的最好的。除非通过“快速方式”,否则您的意思是一种为您进行迭代的方法。即使在这种情况下,答案是否定的,因为您想检查 String[] 对象本身内部的数据。

【讨论】:

  • 是的,我的意思是在代码方面更快。但正如你所说.. 仍然!
【解决方案2】:

LinkedHashMap

使用LinkedHashMap<String, String[]> 代替ArrayList 怎么样?关键是String[1] 值。 Linked 因为这为您提供了可预测的迭代顺序。

辅助地图

或者您可以创建一个Map<String, Integer>,其中键是String[1] 值,值是ArrayListString[] 的索引。

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 的哪个位置。

Guava BiMap

Google 的 Guava 有一些类实现了它们的BiMap 接口。它类似于Map,但它可以双向使用,即您可以根据需要将value 用作key

【讨论】:

  • 感谢您的回复。我已经检查了BiMap,但是对于一个 Uni 项目,我的目标是使用最少数量的依赖项,所以我真的不想使用 Guava。至于上述解决方案,我仍在努力解决您的想法。不是真的和你在一起:p
【解决方案3】:

如果您查看 ArrayList#contains - 您会看到,此方法还会遍历所有元素。

您可以使用 parallelStream - 以便 ArrayList 可以被更多线程搜索。

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

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

【讨论】:

  • 再次抱歉。我的标题可能具有误导性。 “快速”是指“更少的编码”而不是“更少的迭代”。也许我应该重新格式化我的标题
  • 好吧,如果您可以使用 Java 8,那么这只是上面的一条线。 (您也可以使用普通的 stream())
猜你喜欢
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2014-11-05
  • 2018-10-10
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多