【问题标题】:Check if ArrayList<String> contains part of a string检查 ArrayList<String> 是否包含字符串的一部分
【发布时间】:2011-09-19 15:47:13
【问题描述】:

假设我有一个 ArrayList:

<string1.4>
<string2.4>
<string3.4>

当我说 arrayList.containsSubString('string1'); 时,我希望返回 arrayList 的第一个元素;除了遍历arrayList 的每个元素并检查string1 是否是该元素字符串的子字符串之外,如何做到这一点?

【问题讨论】:

  • 你可以改变什么?您是否获得对 ArrayList 的引用并返回第一个匹配项,或者您是否可以控制在列表中插入数据?

标签: java arraylist


【解决方案1】:

我能想到的唯一方法是:

strs.get(strs.indexOf(new Object() {
    @Override
    public boolean equals(Object obj) {
        return obj.toString().contains(s);
    }
}));

不知道这是否被认为是好的做法。

【讨论】:

  • 为我的目的工作。谢谢! arrayList.toString()!
  • 太好了,我也可以使用 startswith
【解决方案2】:

不能。即使有 List.contains() 的等价物,它也只是在底层进行线性搜索。

【讨论】:

    【解决方案3】:

    我认为遍历列表并检查每个项目是最快的方法。这也是每个人理解你的代码的方式。 (构建自己的数据结构除外)。


    无论如何你也可以使用org.apache.commons.collections.CollectionUtils#find(Collection, Predicate)

    find(java.util.Collection collection, Predicate predicate) 找到第一个 给定集合中的元素 匹配给定的谓词。

    【讨论】:

    • 这些方法为你使用循环。
    • @Peter Lawrey:是的——这只是一种重用比较逻辑(谓词)的方法——因为我理解这个问题需要寻找除传统的 for-each-if-check- 之外的其他方式返回方式。
    【解决方案4】:

    对于 ArrayList,除了遍历它之外别无选择。但是您可以使用其他数据结构,例如前缀树(例如 ternary search tree,参见 java sample)。

    【讨论】:

    • java 示例链接已损坏
    【解决方案5】:

    您可以使用 NavigableSet

    NavigableSet<String> set = new TreeSet<String>();
    // add strings
    
    String find =
    String firstMatch = set.ceiling(find);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 2021-03-05
      • 2013-03-14
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2012-11-21
      相关资源
      最近更新 更多