0

文字列から文字を削除するためのより良いアプローチ(時間とスペース)はどれですか?

アプローチ1

String charsToRemove = "abc";
String myString = "abcdef";

myString = myString.replaceAll("["+charsToRemove+"]", "");

アプローチ2

// Initialized to charsToRemove
HashSet<Character> charsToRemoveSet = ...
Character[] myCharArray = myString.toCharArray();


int dst = 0;
for(int src=0; src<myCharArray.length; src++) {
    if(!charsToRemoveSet.contains(myCharArray[src]))
        myCharArray[dst++] = myCharArray[src];
}

myString = new String(myCharArray, 0, dst);
4

2 に答える 2

1

視覚的には、オプション1の方がはるかに明確です。これだけで私はそれを選ぶことができます。また、おそらく同様に高速です(ただし、入力の長さによって異なります)。オプション2では、2番目のループを設定します。HashSet.contains()独自のループを実行し、2番目の遅延を追加します。

短い文字列の場合、違いに気付かない可能性がありますが、もう一度、2番目に何が起こっているのかを判断するのは困難です。

于 2013-01-06T02:12:14.920 に答える
0

文字セットが固定されている場合は、オプション1を次のように変更します

private static Pattern pattern = Pattern.compile("[abc]");

public String removeChars(String s) {
    return pattern.matcher(s).replaceAll("");
}

String.replaceAllは見栄えが良いですが、内部的には毎回Pattern.compileを呼び出します。その上"[" + charsToRemove + "]"、私たちの場合は回避できるパフォーマンスキラーです。

オプション2は

Character[] myCharArray = myString.toCharArray();

動作しません、それはする必要があります

char[] myCharArray = myString.toCharArray();
于 2013-01-06T06:52:38.560 に答える