3

假设我有一个这样的字符串数组:

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

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

最有效的方法是什么?

我知道我可以break在 for 循环中做一个简单的事情,但我听说有人说break在 for 循环中使用是不好的做法。我也听说使用 a whileanddo-while也不好。

我的实现

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

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

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

在哪里:

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

2 回答 2

6

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

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

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

于 2013-01-03T23:21:37.877 回答
0

我知道 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 代码。

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);

这样做是从列表中删除与模式不匹配的任何字符串。如您所见,声明 Predicate 对象有点冗长。如果您使用 Apache-Commons 或 Guava,它看起来会很相似,但这就是 lambdaJ 的用武之地。

谓词只是接受单个参数并返回布尔值的函数的术语,您之前可能已经在 Matcher 类中使用过它们。Hamcrest 拥有一些最好的 Matcher 库,因此 lambdaJ 只是围绕它构建了一个函数式编程库。它易于使用且可读性强。

于 2013-01-04T06:45:12.640 回答