[RESOLVIDO]Erro estranho com concat e/ou melhor solução com replaceAll

2 respostas
P
Olá gente, estou aí novamente, dessa vez o compilador me deixou um pouco irritado ueheuehueh, não consegui descobrir o por que de um mistério (pelo menos para mim) de jeito nenhum. O problema é o seguinte: Faça um programa que, a partir de um texto entrado pelo usuário, imprima o texto removendo todos os espaços em branco adicionais encontrados, de modo que haja, no máximo, um espaço em branco separando as palavras presentes nesse texto. Primeiramente tentei fazer o seguinte:
import java.util.Scanner;

public class Exerc7 {

    public static void main(String[] args) {
        String texto;
        Scanner input = new Scanner(System.in);
        
        System.out.print("Digite um texto: ");
        texto = input.nextLine();
        
        String [] palavras = texto.split(" ");
        texto = "";

   
        for(int i = 0; i < palavras.length; i++)
       {
//         texto += palavras[i].concat(" ");
            texto += palavras[i];
            texto += " ";
        }
   
        System.out.printf("\nTexto com no máximo um espaço entre as palavras: %s\n",texto);
    }
}

que é o que mais fez sentido pra mim a primeira vista, só que por algum motivo, descobir, colocando um System.out.print no for que o compilador por algum motivo montando o texto com o concat com o mesmo número de espaços que o texto tinha quando entrei com a String pela primeira vez, mesmo depois de eu ter apagado o texto com a atribuição texto = "";. Tentei entender colocando vários System.out.print pelo código mas não entendi de jeito nenhum do por que o compilado faz isso, pra mim não fez nenhum sentido, até porque, como eu apaguei o texto com texto = ""; , como é que o compilador poderia "saber" o exato número de espaços entre as palavras que eu tinha entrado? porque o último System.out.printf exibe exatamente o texto que eu entrei no primeiro System.out.print. Então o que fiz para dar certo foi o seguinte código:

import java.util.Scanner;

public class Exerc7 {


    public static void main(String[] args) {
        String texto;
        Scanner input = new Scanner(System.in);
        
        System.out.print("Digite um texto: ");
        texto = input.nextLine();
        
        String finalmente = texto.replaceAll("\\s+", "&");

        texto = finalmente.replaceAll("&", " ");
        System.out.printf("\nTexto com no máximo um espaço entre as palavras: %s\n",texto);

Apelei para expressões regulares, mas o código fica suscetível a erro porque qualquer caracterer que eu coloque para que a função replaceAll susbstitua, o usuário pode ter efetivamente digitado no texto, e esse caracter que não deveria ser substituído, será. No primeiro replaceAll \\s+ quer dizer um ou mais espaços (no mínimo um espaço), depois coloquei pra substituir & porque é um caractere incomum de ser usado em um texto, apesar de não ser impossível. No segundo replaceAll ele substitui todos os & por um único espaço. Então assim, alguém sabe por que o primeiro código dá esse erro de colocar o mesmo número de espaços na saída que na entrada? Ou então como melhorar o segundo código? Ou os dois?

2 Respostas

emanuelCruz

O problema é que se você passa o " " para o split, a cada espaço que ele encontrar, vai adicionar o elemento atual no array, mesmo que este seja vazio.
Exemplo:

teste t
[0] = teste
[1] = “”
[2] = “”
[3] = “”
[4] = “t”

Então ao iterar, você está colocando os espaços exatamente onde eles estavam antes.

Solução: Passe a expressão regular para o split !
Assim:

String [] palavras = texto.split("\\s+");

Aconselho você utilizar o debug para entender o que está ocorrendo

P

emanuelCruz muito obrigado, deu certo, só não entendi muito bem o uqe acontece no array, porque fiz um for pra saída das posições do array e depois de entrar “Vejamos o que há no array ?”, espaços entre a Vejamos e o = 3, espaços entre o e que = 1, espaços entre que e há = 2,espaços entre no e array = 5 e espaços entre array e ? = 1; a saída foi:
[0] = “Vejamos”
[1] = “o”
[2] = “que”
[3] = “há”
[4] = “no”
[5] = “array”
[6] = “?”
de qualquer forma entendi mais ou menos, e realmente, preciso aprender a usar o debug, obrigado pela ajuda e pelo conselho.

Criado 6 de julho de 2012
Ultima resposta 6 de jul. de 2012
Respostas 2
Participantes 2