2010-09-26 109 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    ")); 

}