【问题标题】:Java 8 String ComparisonJava 8 字符串比较
【发布时间】:2018-12-30 23:04:16
【问题描述】:

我有两个字符串列表。 我想检查一个列表中的任何字符串是否在另一个列表中可用。 使用了以下失败的方法。

请告诉我更好的方法

List<String> mylist = Arrays.asList(stringArray1);
List<String> items = Arrays.asList(stringArray2);

return mylist.stream().anyMatch(t->items.stream().anyMatch(t::contains));

【问题讨论】:

  • retainAll 可能是?
  • 顺便说一句,您想获得什么?所有常见的条目?
  • @Eugene 如果任何一个值在另一个列表中可用,我想要一个布尔值
  • 在这种情况下,myList.stream().anyMatch(items::contains) 应该可以完成这项工作

标签: java string arraylist java-8 java-stream


【解决方案1】:

如果要查找items中是否存在mylist中的任何元素,可以先将items转为Set

Set<String> setOfItems = new HashSet<>(items);

然后,您可以简单地迭代 mylist 并检查 setOfItems 中是否包含任何元素。

mylist.stream().anyMatch(setOfItems::contains);

这将您的O(n * k) 问题归结为O(n + k),其中nk 分别是mylistitems 的大小。

【讨论】:

  • G:你是摇滚明星,谢谢
  • 你仍然可以使用单行,mylist.stream().anyMatch(new HashSet&lt;&gt;(items)::contains);。由于这种优化只为更大的集合带来回报,因此甚至可以使用阈值,例如static final int HASH_THRESHOLD = 30; … mylist.stream().anyMatch((items.size() &lt; HASH_THRESHOLD? items: new HashSet&lt;&gt;(items))::contains);
猜你喜欢
  • 2013-01-17
  • 2014-11-11
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多