2017-07-06 16 views
2

基本的に、このコードの機能は次のとおりです。シーケンス内の非ASCII文字を置き換える方法は?

  • 入力してください。
  • 長さが2より大きい文字の各シーケンスを、文字が繰り返された回数と文字自体(たとえばjjjkkkkkllll = 3j5k4l)で置き換えます。入力に数値が含まれていません。
  • 結果を返します。

コード:

private String replaceConsecutiveChars(String data) { 
    char[] dataChars = data.toCharArray(); 

    int i = 0; 
    int k = 0; 
    Character charType = null; 
    for(Character c : dataChars) { 
     if(k == dataChars.length - 1 && i >= 2) { 
      data = data.replace(repeat(String.valueOf(charType), ++i), (i + Character.toString(charType))); 
      break; 
     } 

     if(i == 0) { 
      charType = c; 
      i++; 
     }else if(c == charType) { 
      i++; 
     }else if(c != charType && i > 2) { 
      data = data.replace(repeat(String.valueOf(charType), i), (i + Character.toString(charType))); 

      i = 1; 
      charType = c; 
     }else if(c != charType && i <= 2) { 
      i = 1; 
      charType = c; 
     } 

     k++; 
    } 

    return data; 
} 

private String repeat(String s, int n) { 
    return Stream.generate(() -> s).limit(n).collect(Collectors.joining("")); 
} 

しかし、私の実装では、限られた-ASCII文字セットで動作しているようですが、私はそれは、Unicode文字セットで作業を取得しようとしています。たとえば、次のように

  • 入力ddddddddkkkkkppppます正しく出力さ8d5k4p
  • 入力êêêêÌÌÌÌÌÌÌØØØます入力
  • êêêêÌÌÌÌÌÌÌØØØ誤っ出力"rrrrrêêêêÌÌÌÌÌkkkkØØØ"ますが誤って出力5rêêêêÌÌÌÌÌ4kØØØ

これはなぜでしょうか?

さらに、私がこれをやっているよりも、私が今やっているよりも良い方法がありますか?

+0

なぜCharacterラッパークラスを使用するのですか? –

+0

だから私は 'null'を使うことができます。 –

+0

あなたが使用する唯一の場所は、あなたがループ上に保存している文字のためです。むしろばかげているようだ。なぜあなたはcharを使用して、ループの中で数字をループしないことを知っているので、最初に '1'の値を割り当てますか? –

答えて

4

==を使用しているCharacterのインスタンスを比較しています。値の代わりにオブジェクト参照を比較するため、期待どおりに機能しません。

for (char c : dataChars) { 
} 

お知らせ種類(文字までの文字)の変更:

簡単なクイックフィックスは、forループへの変更です。このようにcharTypeは、cと比較すると、の文字のプリミティブに自動的にアンボックスされます。

もう1つの解決方法は、c == charTypec.equals(charType)に置き換えて、参照値と比較せずに値を比較することです。

関連する問題