【发布时间】:2014-07-10 02:48:33
【问题描述】:
我必须检查一个数组列表是否包含通过对象传递的任何值。
考虑一个值为“abc”、“jkl”、“def”、“ghi”的数组列表。
还有String check="abc,ghi"
我们必须检查字符串中的任何值(abc 或 ghi)是否存在于 arraylist 中,当找到匹配项时我们可以停止检查。
传统上,我们可以用逗号分隔String check,并在迭代中为每个逗号分隔值使用arraylist.contains()。
但这很耗时。有没有更好的方法来做这个检查。
【问题讨论】:
-
ArrayList的最佳搜索时间是 O(n),除非它已排序,在这种情况下你会得到 O(lg n)。是否可以使用HashMap或TreeMap? -
请注意,如果输入是一个 ArrayList,那么对其进行排序将花费 O(n log n) 并将条目放入 HashMap 或 HashSet 将花费 O(n)。你也必须考虑到这一点——你不能只说 HashMap 查找是 O(1) 并完成它。
-
@user3580294 是的,这就是我写“如果输入是 ArrayList”的原因。顺便说一下,在这种情况下,Set 比 Map 更合适。 Maps 用于将键映射到值;集合是用来询问一个值是否存在,这是这里需要的。
-
您不需要使用
HashMap进行迭代,但是是的,这就是您找到密钥的方式。正如@yshavit 指出的那样,你必须小心——如果你只是为此切换集合,你可能会受到超过你可能获得的任何好处的惩罚。 -
@yshavit 是的,完全错过了……我需要新眼镜。是的,
Set可能效果更好,但如果在这种特定情况下使用Set,则仍然存在复制惩罚(尽管较小),并且Set可能无法用作@987654331 的替代品@ 一般是因为它有额外的限制。
标签: java string arraylist equals contains