3

次のコードで実装していますが、StringBuilder からすべての空白を削除するより効率的な方法があるかどうかはわかりません

private static StringBuilder removeBlankSpace(StringBuilder sb){
    for(int i=0;i<sb.length();++i){
        if(Character.isWhitespace(sb.charAt(i))){
            sb.deleteCharAt(i);
                            i--;
        }
    }
    return sb;
}
4

5 に答える 5

11

delete複数回呼び出す必要はありません。各文字を最終位置まで移動し、最後に範囲を削除するだけです。

static void removeBlankSpace(StringBuilder sb) {
  int j = 0;
  for(int i = 0; i < sb.length; i++) {
    if (!Character.isWhitespace(sb.charAt(i))) {
       sb.setCharAt(j++, sb.charAt(i));
    }
  }
  sb.delete(j, sb.length);
}
于 2012-04-23T06:13:08.303 に答える
3

編集: 後世のためにこの回答を残しますが、Keith Randall の O(n) ソリューションははるかに優れています。

遠端から作業する方が効率的であることに気付くかもしれません。そのようにすると、最初の文字を削除するまでに、後で空白をコピーすることはありません。

また、データに複数の空白文字が一緒に含まれる傾向がある場合は、それを見つけdeletedeleteCharAt. 次のようなものです:

private static StringBuilder removeBlankSpace(StringBuilder sb) {
    int currentEnd = -1;
    for(int i = sb.length() - 1; i >= 0; i--) {
        if (Character.isWhitespace(sb.charAt(i))) {
            if (currentEnd == -1) {
                currentEnd = i + 1;
            }
        } else {
            // Moved from whitespace to non-whitespace
            if (currentEnd != -1) {
                sb.delete(i + 1, currentEnd);
                currentEnd = -1;
            }
        }
    }
    // All leading whitespace
    if (currentEnd != -1) {
        sb.delete(0, currentEnd);
    }
    return sb;
}
于 2012-04-23T05:57:01.440 に答える
2

以下はどうですか(StringBuilder sb初期化されていると仮定して):

sb = new StringBuilder(sb.toString().replaceAll("\\s", ""));
于 2012-04-23T05:58:06.697 に答える