2012-08-24 10 views
7

Eventuali duplicati:
Strip Leading and Trailing Spaces From Java StringRimozione spazi alla fine di una stringa in Java

Quando importo i dati a un'applicazione ho bisogno di sbarazzarsi degli spazi alla fine del alcune stringhe ma non quelle all'inizio, quindi non posso usare trim() ... Ho impostato un metodo:

public static String quitarEspaciosFinal(String cadena) { 
    String[] trozos = cadena.split(" "); 
    String ultimoTrozo = trozos[trozos.length-1]; 
    return cadena.substring(0,cadena.lastIndexOf(ultimoTrozo.charAt(ultimoTrozo.length()-1))+1); 
    } 

dove cadena è la stringa devo trasformare ...

Quindi, se Cadena = "1234" questo metodo sarebbe tornato "1234" ...

mi piacerebbe sapere se c'è un più efficiente modo per farlo ...

+0

La stringa è una parola sola o può essere una frase? – oopsi

+0

@oopsi: non importa in realtà ^^ – m0skit0

risposta

21

È possibile utilizzare il metodo replaceAll() sulla corda, con la regex \s+$:

return cadena.replaceAll("\\s+$", ""); 

Se solo si desidera rimuovere spazi reali (non tabulati né nuove linee), sostituire \\s da uno spazio nel re gex.

+3

Non vorrei usare * ma +. Inutile sostituire 0 spazi;) – m0skit0

+0

'replaceFirst' servirebbe allo scopo anche qui. –

+0

Prego! – kgautron

6
public static String replaceAtTheEnd(String input){ 
    input = input.replaceAll("\\s+$", ""); 
    return input; 
} 
+2

Non vorrei usare * ma +. Inutile sostituire 0 spazi;) – m0skit0

+1

@ m0skit0 :) Era il primo +, quindi ho modificato in *, non ho idea del perché :). grazie però – Eugene

8
String s = " this has spaces at the beginning and at the end  "; 
    String result = s.replaceAll("\\s+$", ""); 
4

lo farei in questo modo:

public static String trimEnd(String s) 
{ 
    if (s == null || s.length() == 0) 
     return s; 
    int i = s.length(); 
    while (i > 0 && Character.isWhitespace(s.charAt(i - 1))) 
     i--; 
    if (i == s.length()) 
     return s; 
    else 
     return s.substring(0, i); 
} 

È il modo più dettagliato rispetto all'utilizzo di un'espressione regolare, ma è probabile che sia più efficiente.

+0

Posso conoscere il motivo del downvote? –

+0

Non sarei così sicuro dell'efficienza (le regex potrebbero essere codificate nel codice nativo). Ed è inutile reinventare la ruota, in realtà. Perché codificare qualcosa manualmente che puoi già fare con le librerie? Puoi reinventare la ruota solo se ciò che è disponibile non ti soddisfa (o è troppo lento). Ottimizza in seguito;) E ho effettivamente rimosso il downvote: P – m0skit0

+0

Ovviamente l'unico modo per essere sicuri dell'efficienza è testare un insieme di dati significativo. Detto questo, è probabile che una regexp paghi per la sua generalità: ad esempio i motori regexp solitamente traducono le espressioni di input per l'efficienza, che è un passo che la mia versione non deve eseguire. Per quanto riguarda le librerie esterne tendo ad essere d'accordo con te, ma è ancora un compromesso tra il mantenimento di un piccolo pezzo di codice e tenere traccia di un'altra dipendenza. Perché, a volte basta meno codice ed eseguire il debug di qualcosa di te stesso piuttosto che cercare una soluzione pronta! –