2010-09-26 15 views
23

Escribo esta función para una aplicación j2me, por lo que no tengo disponibles algunas de las clases de Java más avanzadas/modernas. Estoy obteniendo java.lang.ArrayIndexOutOfBoundsException en esto. Entonces, al parecer, o no le gusta la forma en que he inicializado la nueva matriz de Caracteres, o no estoy haciendo algo correctamente al llamar a System.arraycopy(). ¡Cualquiera y todos los consejos son apreciados!recortar el espacio en blanco de una cadena?

/* 
* 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

Como se señaló, hay un método String.trim() que omití. Sin embargo, pensé que agregaría lo que descubrí mientras tanto, ya que soy un novato de Java y esto podría ser útil para otros. De los documentos para System.arraycopy(): "... se lanza una excepción IndexOutOfBoundsException [if] ... destPos + length es mayor que dest.length, la longitud de la matriz de destino." iow, podría arreglar mi código inicializando mi matriz temporal así: "char [] newChars = new char [len - 1];" – user458442

Respuesta

13

String.trim() es muy antiguo, al menos para Java 1.3. Usted no tiene esto?

+1

En realidad, sí, de alguna manera me lo perdí al buscar la solución. :/ Muchas gracias. – user458442

+1

¡Yay! ¡Solución fácil! –

+1

IIRC 'trim()' estaba en Java 1.1 –

35

La manera simple de recortar los espacios en blanco iniciales y finales es llamar al String.trim(). Si solo desea recortar solo los espacios iniciales y finales (en lugar de todos los espacios en blanco iniciales y finales), existe un método de Apache commons llamado StringUtils.strip(String, String) que puede hacer esto; llámalo con " " como segundo argumento.

Su código intentado tiene una serie de errores, y es fundamentalmente ineficiente. Si realmente desea implementar esto por sí mismo, entonces usted debe:

  1. contar los caracteres espacio inicial
  2. contar el caracteres espacio final
  3. llamada String.substring(from, end) para crear una nueva cadena que contiene los caracteres que desea conservar.

Este enfoque evita copiar cualquier carácter .


1 - En realidad, eso depende de la implementación de String. Para algunas implementaciones, no habrá copia, para otras se realizará una única copia. Pero, o bien es una mejora en su enfoque, que implica un mínimo de 2 copias, y más si hay algún personaje para recortar.

0

La matriz de destino newChars no es lo suficientemente grande como para mantener los valores copiados. Debe inicializarlo a la longitud de los datos que intenta copiar (por lo tanto, longitud - 1).

3

Primero que todo, lo que otros dijeron sobre String.trim(). Realmente, no reinventes la rueda.

Pero, para que conste, lo que no funciona con su código es que las matrices de Java no se pueden redimensionar. Cuando inicialmente configura su matriz objetivo, la crea como una matriz de tamaño 0. A continuación, diga System.arraycopy para rellenar los caracteres len - 1 allí. Eso no va a funcionar. Si usted quiere que funcione, que había necesidad de configurar la matriz como:

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

pero eso es increíblemente ineficiente, y la copia de la reasignación de una nueva matriz en cada iteración del bucle. Use los tres pasos que mencionó Stephen C, que termina con un substring.

2

Apache StringUtils.strip es la mejor respuesta aquí que funciona con todos los caracteres de espacio en blanco esperados (no sólo el espacio), y can be downloaded here:

Aquí está el código correspondiente ripped from this source file para ponerlo en práctica en su propia clase si quería, pero en realidad , simplemente descarga y utiliza StringUtils para obtener más dinero por tu dinero. Tenga en cuenta que puede usar StringUtils.stripStart para recortar cualquier carácter principal de una cadena 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

Por el bien de cortar y pegar ciegas: public static final int INDEX_NOT_FOUND = -1; – Mike

1

Si no desea utilizar el método String.trim(), se puede implementar de la siguiente manera. La lógica manejará diferentes escenarios como espacio, pestaña y otros caracteres especiales.

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    ")); 

} 
Cuestiones relacionadas