2017-07-06 59 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

您使用的唯一地方是您在循環中保存的字符。似乎相當愚蠢。你爲什麼不使用一個字符並且最初爲它賦值'1',因爲你知道你永遠不會循環遍歷循環中的一個數字? –

回答

4

您正在使用==來比較字符的實例,它不會按預期工作,因爲操作符會比較對象引用而不是值。

一種簡單快速的修復方法是for循環改變爲:

for (char c : dataChars) { 
} 

通知的類型的變化(字符爲char)。當將charTypec進行比較時,charType自動拆箱到原始文件char

另一種解決方案是將每個c == charType替換爲c.equals(charType)以不比較引用,而是值。