2017-05-01 142 views
-4

我想寫一個使用Java 8的方法,它使用兩個參數,一個字符串和一個整數。該方法將返回另一個與輸入字符串相似的字符串,但刪除了某些字符。計算字符串中連續出現的字符java 8

它將從相同字符的連續運行中刪除字符,其中運行的長度大於輸入參數。

我可以使用簡單的Java for循環做到這一點,但我正在尋找一個使用Java 8特性的解決方案,可能是lambda表達式。例如,如果該方法的輸入是(「aaab」,2),那麼它應該返回「aab」,如果(「aabb」,1)應該返回「ab」。

使用for循環

 public String eliminate(String S, int allowed) { 
     int count = 1; 
     StringBuilder sb = new StringBuilder(); 

     try { 
      sb.append(S.charAt(0)); 
      for (int i = 1; i < S.length(); i++) { 
       if (S.charAt(i) == S.charAt(i - 1)) { 
        if (count < allowed) { 
         sb.append(S.charAt(i)); 
         count = count + 1; 
        } 
       } else { 
        sb.append(S.charAt(i)); 
        count = 1; 
       } 
      } 

     } catch (StringIndexOutOfBoundsException e) { 
      e.printStackTrace(); 
     } 
     return sb.toString(); 
    } 
+1

歡迎計算器。請,你能提供一些你的具體問題的代碼嗎?這將有助於其他成員更好地瞭解您的問題,當時,您會爲他們提供您問題的背景。請檢查這些鏈接:https://stackoverflow.com/help/mcve和 https://stackoverflow.com/help/how-to-ask –

+0

流是不是真的這個工作的最佳工具。當你可以獨立地以相同的方式處理很多元素(如集合的成員)時,流很棒。理想情況下,處理每個應該沒有副作用。當需要組合連續元素的信息(這對於計算相同字符的運行是必需的)時,請考慮使用循環而不是流。 –

+0

我能夠做到這一點使用簡單的循環,但有什麼辦法可以使用Lambda表達式或Java 8中新增的功能來做同樣的事情。實際上,我需要處理很多元素,我簡化了解決方案並在此處發佈。 – user7945980

回答

1

的代碼之後有要使用Java 8個特徵的原因是什麼?我認爲它不會很流暢,因爲流一次只能看一個元素。爲了記住以前的內容,你基本上必須做同樣的事情,你現在也在做。其他新功能似乎也不是特別有用。

相反,我認爲,一個普通的老正則表達式正是你所需要的:

private static String eliminate(String input, int limit) 
{ 
    return input == null ? null : input.replaceAll("(.)(\\1{" + (limit - 1) + "})\\1*", "$1$2"); 
} 

這種方法縮短重複字符到指定長度的每個sequencs。替換是這樣的:( '' 使用的東西,而不是像其他\ W特定字符)

  • 找到具有
    • (.)一個字符一個子
    • (\\1{" + (limit - 1) + "})之後(LIMIT- 1)相同的炭的
    • \\1*後跟任意數量相同炭
  • 的並替換它的無線第
    • $1所述第一部分(一個字符)和
    • $2所述第二部分(限制-1個字符)
相關問題