Forma correcta de aparar um texto em Java

em Java, estou a fazer isto para aparar uma corda:

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.trim();
System.out.println("after->>"+input+"<<-");

a saída é:

before->> some Thing <<-
after->>some Thing<<-

funciona. Mas pergunto-me se atribuindo uma variável a si mesma, estou a fazer a coisa certa. Não quero desperdiçar recursos criando outra variável e atribuindo-lhe o valor reduzido. Gostaria de fazer o corte no local.

Então, estou a fazer isto bem?

Author: Quest Monger, 2013-11-29

8 answers

Estás a fazer bem. Da documentação:

As Cadeias de caracteres são constantes; os seus valores não podem ser alterados após a sua criação. Os 'buffers' de texto suportam os 'strings' mutáveis. Porque os objetos de String são imutáveis eles podem ser compartilhados.

Também da documentação :

Aparar

Aparar cordas públicas ()

Devolve uma cópia do texto, com espaços em branco iniciais e finais omitir. Se este objecto representa uma sequência de caracteres vazia, ou os primeiros e últimos caracteres da sequência de caracteres representada por este objecto de texto ambos têm códigos superiores a '\u0020 ' (o espaço caractere), então uma referência a este objeto de cadeia é retornada.

Caso contrário, se não existir um carácter com um código superior a '\u0020' no texto, então um novo objecto de texto que representa um texto vazio é criado e devolvido.

Caso contrário, que k seja o índice do primeiro carácter do texto cujo código é superior a "\u0020" e que seja o índice do último carácter do texto cujo código é maior que'\u0020'. A é criado um novo objecto de texto, representando o sub-texto deste texto que começa com o carácter no índice k e termina com o caractere no índice m - isto é, o resultado disto.substring (k, m+1).

Este método pode ser utilizado para aparar espaços em branco (tal como acima definido) a partir de o início e fim de uma corda.

Devolve:

Uma cópia deste texto com o espaço branco inicial e final removido, ou este texto se não tiver branco inicial ou final espaco.

 17
Author: gpojd, 2013-11-29 18:14:26

Como as cadeias de caracteres em Java são objectos imutáveis , não há forma de executar a limpeza no local. A única coisa que você pode fazer para aparar o texto é criar uma nova versão aparada do seu texto e devolvê-lo (e isso é o que o método trim() faz).

 10
Author: aga, 2013-11-29 18:11:42
Em teoria, não se atribui uma variável a si mesma. Está a atribuir o valor devolvido do método trim () à sua entrada variável.

Na prática, a implementação do método trim () é otimizada de modo que ele está criando (e retornando) outra variável apenas quando necessário. Em outros casos (quando não há realmente necessidade de aparar) ele está retornando uma referência à string original (neste caso você está realmente atribuindo uma variável para si mesmo).

Ver http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.trim%28%29

De qualquer forma, o Trimm() não modifica o texto original, por isso esta é a forma correcta de O usar.

 2
Author: Dario, 2013-11-29 18:19:32

A abordagem tradicional é utilizar o método de acabamento alinhado...por exemplo:

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
System.out.println("after->>"+input.trim()+"<<-");
Se for uma corda que deve ser aparada para todas as utilizações, apara-a à frente, como fizeste. Reutilizar a mesma localização de memória como você fez não é uma má ideia, se você quiser comunicar sua intenção a outros desenvolvedores. Ao escrever em Java, o gerenciamento de memória não é uma questão chave, uma vez que o "dom" de Java é que você não precisa geri-lo.
 1
Author: Bruce Chidester, 2013-11-29 18:13:31
Sim,mas ainda haverá dois objetos até que o coletor de lixo remova o valor original para o qual a entrada estava apontando. Strings em Java são imutáveis. Aqui está uma boa explicação: imutabilidade de cadeias de caracteres em Java .
 1
Author: Isaac, 2017-05-23 12:02:14

Se tivermos de aparar uma cadeia de caracteres sem usar os métodos trim(), split() de Java, então seguir o código fonte pode ser útil.

static String allTrim(String str)
{
    int j = 0;
    int count = 0;  // Number of extra spaces
    int lspaces = 0;// Number of left spaces
    char ch[] = str.toCharArray();
    int len = str.length();
    StringBuffer bchar = new StringBuffer();
    if(ch[0] == ' ')
    {
        while(ch[j] == ' ')
        {
            lspaces++;
            j++;
        }   
    }   
    for(int i = lspaces; i < len; i++)
    {   
        if(ch[i] != ' ')
        {
            if(count > 1 || count == 1)     
            {
                bchar.append(' ');
                count = 0;
            }
            bchar.append(ch[i]);
        }
        else if(ch[i] == ' ')
        {
            count++;    
        }
    }
    return bchar.toString();
}
 0
Author: pnkjshrm30, 2015-01-11 15:58:57

O método java string trim() elimina espaços iniciais e finais

public class StringTrimExample{  
public static void main(String args[]){  
String s1="  hello string   ";  
System.out.println(s1+"javatpoint");//without trim()  
System.out.println(s1.trim()+"javatpoint");//with trim()  
}}  

resultado

 hello string   javatpoint
hello stringjavatpoint   
 0
Author: Mahmoud Elebiary, 2018-03-28 22:13:49

Este pedaço de código que fiz há muito tempo, que leva um array de caracteres como parâmetro e devolve um texto. Pouco mais de modificações necessárias para pontuações, embora com valores ascii. Pode ser de alguma ajuda.

  public static String trim(char [] input){
    char [] output = new char [input.length];
    int j=0;
    int jj=0;
    if(input[0] == ' ' )    {
        while(input[jj] == ' ') 
            jj++;       
    }
    for(int i=jj; i<input.length; i++){
      if(input[i] !=' ' || ( i==(input.length-1) && input[input.length-1] == ' ')){
        output[j]=input[i];
        j++;
      }
      else if (input[i+1]!=' '){
        output[j]=' ';
        j++;
      }      
    }
    char [] m = new char [j];
    int a=0;
    for(int i=0; i<m.length; i++){
      m[i]=output[a];
      a++;
    }
    return new String (m);
  }
 -1
Author: Farah Nazifa, 2015-02-01 12:12:05