2010-09-26 143 views
23

我寫此功能J2ME應用程序,所以我沒有一些更高級的/現代的Java類提供給我。我得到這個java.lang.ArrayIndexOutOfBoundsException。所以,顯然或者它不喜歡我初始化newChars數組的方式,或者在調用System.arraycopy()時我沒有正確地做某件事。任何和所有的建議表示讚賞!從字符串修剪空白?

/* 
* remove any leading and trailing spaces 
*/ 
public static String trim(String str) { 
    char[] chars = str.toCharArray(); 
    int len = chars.length; 
    // leading 
    while ((len > 0) && (chars[0] == ' ')) { 
     char[] newChars = new char[] {}; // initialize empty array 
     System.arraycopy(chars, 1, newChars, 0, len - 1); 
     chars = newChars; 
     len = chars.length; 
    } 
    // TODO: trailing 
    return chars.toString(); 
} 
+1

正如指出的那樣,我錯過了一個String.trim()方法。不過,我想我會添加我發現的同時,因爲我是一個java noob,這可能會對其他人有所幫助。從System.arraycopy()的文檔中:「...拋出IndexOutOfBoundsException [if] ... destPos +長度大於dest.length,即目標數組的長度。」喵,我可以通過像這樣初始化我的臨時數組來修復我的代碼:「char [] newChars = new char [len - 1];」 – user458442 2010-09-26 00:41:20

回答

13

String.trim()很老了,至少java 1.3。你沒有這個?

+1

其實,是的 - 我在尋找解決方案時不知何故錯過了它。 :/ 非常感謝。 – user458442 2010-09-26 00:39:44

+1

耶!輕鬆修復! – 2010-09-26 00:48:44

+1

IIRC'trim()'在Java 1.1中 – 2013-01-27 08:07:15

35

簡單的方法修剪開頭和結尾的空白是調用String.trim()。如果你只是想修剪前導和尾隨空格(而不是所有前導和尾隨空格),那麼可以使用名爲StringUtils.strip(String, String)的Apache commons方法;作爲第二個參數,用" "來稱呼它。

你試圖代碼有許多錯誤,而且是從根本上效率低下。如果你真的想這個工具你自己,那麼你應該:

  1. 算前導空格字符
  2. 算尾隨空格字符
  3. 呼叫String.substring(from, end)創建一個包含你想保留的字符的新字符串。

這種方法避免了複製任何字符。


1 - 其實,這取決於String實施。對於某些實現將不會複製,對於其他實現則會進行單個複製。但是,無論是對方法的改進,至少需要2個副本,並且如果有任何字符需要修剪,則更多。

0

目的數組newChars是不足夠大以容納複製的值。您需要將它初始化爲您想要複製的數據的長度(所以,長度爲1)。

3

首先,別人怎麼說,大約String.trim()。真的,不要重新發明輪子。

但備案,什麼是你的代碼腳麻是Java數組不調整大小。當您最初設置目標數組時,將其創建爲大小爲0的數組。然後你告訴System.arraycopy填充len - 1字符。這是行不通的。如果你想它的工作,你需要設置的陣列爲:

char[] newChars = new char[len - 1]; 

但是,這是令人驚訝的低效率,重新分配,並通過每一次循環中複製一個新的數組。使用Stephen C提到的三個步驟,以substring結尾。

2

阿帕奇StringUtils.strip是這裏最好的答案,與所有預期的空白字符作品(不只是空間),can be downloaded here

下面是相關的代碼ripped from this source file實現它在自己的類,如果你想要的,但真的,只需下載並使用StringUtils即可獲得更大的壓力!請注意,您也可以使用StringUtils.stripStart修剪Java字符串中的任何前導字符。

public static String strip(final String str) { 
    return strip(str, null); 
} 

public static String stripStart(final String str, final String stripChars) { 
    int strLen; 
    if (str == null || (strLen = str.length()) == 0) { 
     return str; 
    } 
    int start = 0; 
    if (stripChars == null) { 
     while (start != strLen && Character.isWhitespace(str.charAt(start))) { 
      start++; 
     } 
    } else if (stripChars.isEmpty()) { 
     return str; 
    } else { 
     while (start != strLen && stripChars.indexOf(str.charAt(start)) != INDEX_NOT_FOUND) { 
      start++; 
     } 
    } 
    return str.substring(start); 
} 

public static String stripEnd(final String str, final String stripChars) { 
    int end; 
    if (str == null || (end = str.length()) == 0) { 
     return str; 
    } 

    if (stripChars == null) { 
     while (end != 0 && Character.isWhitespace(str.charAt(end - 1))) { 
      end--; 
     } 
    } else if (stripChars.isEmpty()) { 
     return str; 
    } else { 
     while (end != 0 && stripChars.indexOf(str.charAt(end - 1)) != INDEX_NOT_FOUND) { 
      end--; 
     } 
    } 
    return str.substring(0, end); 
} 

public static String strip(String str, final String stripChars) { 
    if (isEmpty(str)) { 
     return str; 
    } 
    str = stripStart(str, stripChars); 
    return stripEnd(str, stripChars); 
} 
+1

爲了盲目剪貼,public static final int INDEX_NOT_FOUND = -1; – Mike 2017-09-26 04:49:23

1

如果你不想使用String.trim()方法,那麼就可以像下面執行。邏輯將處理不同的場景,如空間,選項卡和其他特殊字符。

public static String trim(String str){ 
    int i=0; 
    int j = str.length(); 
    char[] charArray = str.toCharArray(); 
    while((i<j) && charArray[i] <=' '){ 
     i++; 
    } 
    while((i<j) && charArray[j-1]<= ' '){ 
     j--; 
    } 
    return str.substring(i, j+1); 

} 

public static void main(String[] args) { 
    System.out.println(trim(" abcd ght trip    ")); 

}