2017-04-16 17 views
0

我試圖從控制檯中接收一定長度的字符串,並將字符串中的空字符設置爲星號。修改字符數組中的空字符

System.out.println("Enter a string of digits."); 

     someString = input.next(); 

     if(someString.matches("\\d{0,9}")) { 

      charArr = someString.toCharArray(); 

      for (char digit: charArr) { 
       if(!Character.isDefined(charArr[digit])){ 
        charArr[digit] = '*'; 
       } 
      } 

      System.out.printf("Your string is: %s%n", new String(charArr)); 

此代碼拋出一個數組索引超出界限異常,我不知道爲什麼。

回答

0

想你可以做到一條線:

newString = someString.replaceAll("\\s", "*"); 

「\ s」是空格字符的正則表達式模式。

+0

這是我正在尋找的答案,但我找到了一個不同的解決方案。不管怎麼說,多謝拉。 – LifesAHaskell

1

for (char digit: charArr)將迭代來自charArr的每個字符。
因此,digit包含來自charArr的字符值。

當你寫charArr[digit]訪問來自charArr元素,你是從數據類型轉換chardigit價值int。例如,您有charArr = new char[]{'a','b','c'}
charArr['a']相當於charArr[97],但charArr僅具有長度3的大小。

因此,charArr無法訪問其大小的元素大小並拋出ArrayIndexOutOfBoundsException


解決方案:循環遍歷數組索引明智而不是元素明智。

for(int i = 0; i < charArr.length; i++) { 
    // access using charArr[i] instead of charArr[digit] 
    ... 
} 
0

這個循環語句:

for (char digit: charArr) { 

迭代的在數組中。這些值具有類型char,並且可以是從0到65535的任何不過,這一說法

if (!Character.isDefined(charArr[digit])) { 

使用digit作爲陣列的索引。爲了「工作」(即不要拋出異常),該值需要在範圍0charArr.length - 1之間。很顯然,對於您正在使用的輸入字符串,其中一些值不可用作索引(例如value >= charArr.length),並且會出現異常。

但是你不想通過測試來解決這個問題value在所需的範圍內。無論如何,value的值不是(從語義角度看)數組索引。 (如果你使用它們,好像它們是索引,你最終會丟失陣列中的一些位置)

如果你想索引的數組中的值,這樣做:

for (int i = 0; i < charArr.length; i++) { 

,然後使用i作爲索引。


即使您修復了這個問題,您的代碼仍然存在問題...對於某些使用情況。

如果您的輸入使用UTF-8編碼(例如),它可能包含大於65535的Unicode碼位(字符),並在Java字符串中編碼爲兩個連續的char值。 (所謂的替代對。)如果您的字符串包含代理對,則isDefined(char)不是有效的測試。相反,您應該使用isDefined(int)(更重要的是)迭代字符串中的Unicode代碼點,而不是char值。

0

我想你是在混合你的for塊。在你的例子中,你要檢查你的someString.toCharArray()中的每個字符,所以你不能做!Character.isDefined(charArr[digit]),因爲digit是一個char,而不是int。你不能用char來獲取數組的索引。

如果你檢查純粹是假如一個字符是一個空間,你可以簡單地執行下列操作之一:

  1. if (digit != ' ')
  2. if (!Character.isWhiteSpace(digit)
  3. if (Character.isDigit(digit))