2

文字列からすべての重複を削除するか、パラメーターに基づいて同じ 2 文字のみを連続して保持するメソッドを作成しようとしています。

例えば:

helllllllo -> helo

また

helllllllo -> hello- これは二重文字を保持します

現在、次のようにして重複を削除します。

private String removeDuplicates(String word) {
    StringBuffer buffer = new StringBuffer();
    for (int i = 0; i < word.length(); i++) {
        char letter = word.charAt(i);
        if (buffer.length() == 0 && letter != buffer.charAt(buffer.length() - 1)) {
            buffer.append(letter);
        }
    }
    return buffer.toString();
}

二重文字を保持したい場合は、プライベート文字列のようなメソッドを持つことを考えていましたremoveDuplicates(String word, boolean doubleLetter)

doubleLettertrue の場合はhellonotを返しますhelo

多くのコードを複製せずにこれを行う最も効率的な方法はわかりません。

4

4 に答える 4

5

正規表現を使用しないのはなぜですか?

 public class RemoveDuplicates {
      public static void main(String[] args) {
           System.out.println(new RemoveDuplicates().result("hellllo", false)); //helo
           System.out.println(new RemoveDuplicates().result("hellllo", true)); //hello
      }

      public String result(String input, boolean doubleLetter){
           String pattern = null;
           if(doubleLetter) pattern = "(.)(?=\\1{2})";
           else pattern = "(.)(?=\\1)";
       return input.replaceAll(pattern, "");
      }
 }

 (.)    --> matches any character and puts in group 1. 
 ?=     --> this is called a positive lookahead. 
 ?=\\1  --> positive lookahead for the first group

したがって、全体として、この正規表現は、単独で続く (正の先読み) 文字を探します。たとえば、aa や bb など。実際には最初の文字のみが一致の一部であることに注意することが重要です。したがって、「hello」という単語では、最初の l のみが一致します ((?=\1) の部分は一致しません)。試合の一部)。したがって、最初の l は空の文字列に置き換えられ、正規表現と一致しない helo が残ります

2 番目のパターンも同じですが、今回は最初のグループが 2 回出現することを先読みします。たとえば、hello です。一方、'hello' は一致しません。

詳細については、こちらをご覧ください:正規表現

PSそれが助けになった場合は、自由に答えを受け入れてください。

于 2013-04-17T07:52:05.097 に答える
3

試す

    String s = "helllllllo";
    System.out.println(s.replaceAll("(\\w)\\1+", "$1"));

出力

helo
于 2013-04-17T07:53:16.660 に答える
1

これを試してください。これが最も効率的な方法です[コメント後に編集]:

public static String removeDuplicates(String str) {
    int checker = 0;
    StringBuffer buffer = new StringBuffer();
    for (int i = 0; i < str.length(); ++i) {
        int val = str.charAt(i) - 'a';
        if ((checker & (1 << val)) == 0)
            buffer.append(str.charAt(i));
        checker |= (1 << val);
    }
    return buffer.toString();
}

一意性を識別するためにビットを使用しています。

編集:

全体のロジックは、文字が解析された場合、対応するビットが設定され、次にその文字が表示されたときに文字列バッファーに追加されず、対応するビットが既に設定されているということです。

于 2013-04-17T07:56:53.347 に答える