3

次のような文字列の配列があるとします。

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

各文字列 (配列の各インデックス内) で特定の部分文字列 (たとえば ) を検索し、部分文字列の最初のインスタンスが見つかったときにplain戻ります。true

これを行う最も効率的な方法は何ですか?

for ループで単純なことができることは知っていますが、forループでの使用は悪い習慣breakだと人々が言うのを聞いたことがあります。また、 andbreakの使用もよくないと聞きます。whiledo-while

私の実装

ブレークを使用した簡単な実装は次のとおりです。

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 ループで単純なブレークを実行できることは知っていますが、for ループでブレークを使用するのは悪い習慣だと人々が言うのを聞いたことがあります。

これはどこで見つけたのですか?それは完全に間違っています。for ループで break を使用するのは悪い習慣ですか?

for ループを使用してStrings をループするだけです。に特定の部分文字列があるString#containsかどうかを確認するために使用します。次に、 を変数 (または必要に応じてインデックス) にString格納し、 .Stringbreak;

于 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;
}

これについて私が気に入らないことの 1 つは、最初に見つかったインスタンスでのみ true を返すことです。あなたが何をしようとしているのか完全にはわかりませんが、パターンに一致しない配列内のインデックスを気にしない場合は、フィルターと呼ばれる高次関数を使用することをお勧めします。

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 に答える