【问题标题】:Check if a list contains an substring from a list of strings without iterating the list在不迭代列表的情况下检查列表是否包含字符串列表中的子字符串
【发布时间】:2022-01-24 16:35:20
【问题描述】:
    List list = new ArrayList();
    list.add("adminGroup");
    list.add("customerGroup");
    list.add("masterSalesGroup");
    System.out.println(list); //["adminGroup","customerGroup","masterSalesGroup"]
    list.contains("sales"); //false

expected output for list.contains("sales"); //true

我想检查列表是否包含“销售”。 如果任何列表元素包含“销售”字样,我需要 true。

【问题讨论】:

标签: java arrays list arraylist java-8


【解决方案1】:

list.contains("sales") 的预期输出; //真

List/ArrayList 的标准 JDK 实现无法做到这一点。

同样,输入列表需要以一种或另一种方式迭代,以检查其任何 String 条目是否包含给定的子字符串,是否单独检查每个条目(在循环或流中)或是否所有条目都已连接在更大的字符串中(使用List::toStringString::join/ String::valueOf 等)

假设隐式迭代不计为“迭代”,可能的解决方案之一就是检查列表字符串表示是否包含字符串:

list.toString().toLowerCase().contains("sales") // -> true

另一种解决方案是使用String::matches(但是,在构建正则表达式模式时,搜索字符串需要用".*"包围):

list.toString().matches("(?i).*sales.*"); // -> true

【讨论】:

  • 非常感谢@Alex
  • 如果不计算隐式迭代,干净的list.stream().anyMatch(s -> s.contains("sales"))toString() hack 更可取。
  • 新年快乐,@Holger! :) 我提到了流并且没有考虑作为解决方案,因为 imo 它在单独检查列表的每个元素时使用迭代,而 toString以某种方式整个列表转换为单个实体。跨度>
  • 我认为将这些操作分开是没有意义的。 toString()“somehow”将列表转换为字符串,stream().anyMatch(…)“somehow”检查是否至少有一个元素满足谓词。但是您的方法对 toString() 的实际作用做出了具体的隐含假设。如果特定的List 实现选择做其他事情,你的方法就会失败。相比之下,Stream API 尽可能地从迭代中抽象出来,同时仍然保持必要的契约来做预期的事情。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多