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?