繁体   English   中英

搜索String数组以查找子字符串的最有效方法

[英]Most efficient way to search String array for substring

假设我有一个字符串数组,如下所示:

0 ["Some plain text"]
1 ["Foobar chicken"]

我想在每个String(在数组的每个索引中)搜索特定的子字符串,比如说plain ,然后在找到子字符串的第一个实例时返回true

这样做最有效的方法是什么?

我知道我可以在for循环中做一个简单的break ,但我听说有人说在for循环中使用break是不好的做法。 我也听说过,使用一段while并且do-while也不好。

我的实施

这是我使用break的简单实现:

for (String[] index : tmpList) {
    retVal = index[2].toLowerCase().contains(keyword);

    if (retVal) // Break when retVal is true
        break;
}

哪里:

  • tmpList是一个ArrayList<String[]>
  • keyword是我想要找到的

我知道我可以在for循环中做一个简单的休息,但我听说有人说在for循环中使用break是不好的做法。

你在哪里找到这个? 那是完全错误的。 在for循环中使用break是不好的做法吗?

只需使用for循环并循环遍历String 使用String#contains检查String是否具有特定的子字符串。 然后将String存储在变量(或索引,如果需要)中并break;

我知道apache-commons有一个名为StringUtils的实用程序类,它可以为您提供一个优雅的解决方案。

public boolean foo(String[] array, String pattern){
    for(String content : array){
        if(StringUtils.contains(content, pattern){
            return true;
        }
    }
    return false;
}

我不喜欢这件事的一件事是它只会在第一个找到的实例中返回true。 我不完全确定你要做什么,但如果不这样做,如果不关心数组中与模式不匹配的索引,我建议使用名为filter的高阶函数。

Guava,lambdaJ和Apache-Commons是支持函数式编程的库。

下面是一些应该在Apache-Commons中运行的sudo-code。

List<String> content = Arrays.asList(strArray);
Predicate matchesPattern = new Predicate("asdf"){{
    private String pattern;
    public Predicate(String pattern){
        this.pattern = pattern;
    }
    @Overload
    public boolean evaluate(Object input){

        if(input instanceOf String){
            StringUtils.contains((String)input, pattern
        }
        return false;
    }
}};

CollectionUtils.filter(content, matchesPattern);

这样做是从列表中删除与模式不匹配的任何String。 正如你所看到的,它是一个有点冗长的声明一个Predicate对象。 如果你使用Apache-Commons或Guava,它看起来会很相似,但这就是lambdaJ拯救的地方。

谓词就是函数的术语,它接受一个参数并返回一个布尔值,你可能以前在Matcher类中使用过它们。 Hamcrest有一些最好的Matcher库,所以lambdaJ只是围绕它构建了一个函数式编程库。 它易于使用且具有高可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM