[RESOLVIDO]Como fazer uma String se moldar aos poucos em Java

Alguém sabe como fazer uma string se formar aos poucos, tipo assim: paçoca iria se formar assim:

p
pa
paç
paço...

Dessa maneira e obrigado desde já :slight_smile:

1 curtida

String é um objeto imutável, você não consegue alterar seu conteúdo.
Mas você pode utilizar um StringBuilder e ficar fazendo um append de cada caractere.

2 curtidas

Os problemas encontrado na sua pergunta:

  • Moldar?
  • Em qual momento você quer criar essa palavra de exemplo?
  • Existe algum código tentantiva?
  • Poderia exemplificar com detalhes pertinentes a programação?

Sua pergunta é vaga, sem pé e sem cabeça e fica complicado responder!

Eu disse moldar no sentido de constituir, vou explicar melhor.

import java.util.Scanner;

public class Main {

	public static void main(String[] palavras) {

		boolean continuar = true;
		char opcao;
		Scanner entrada= new Scanner(System.in);
		
		
	while(continuar) {	
		Scanner input = new Scanner(System.in);
		String palavra = input.next();
		while (!palavra.isEmpty()) {
		palavra = palavra.replaceAll("_", " ");
		System.out.println(palavra);
		if (!palavra.isEmpty()) palavra = palavra.substring (1); 
		}
		System.out.println("Digite 'p' para parar: ");
        opcao = entrada.next().charAt(0);
        if(opcao=='p'){
        continuar=false;
        System.out.println("Finalizado");
        input.close();
        entrada.close();
    }
    else{
       
    };	
     }
   }
}

eu fiz esse comando para que uma palavra quando digitada fique assim:

batata
batat
bata
bat
ba
b

agora eu gostaria de saber se tem alguma forma de deixar assim:

b
ba
bat
bata
batat
batata
1 curtida

ainda não sei como funciona essa “StringBuilder”, vou pesquisar

Toda String no Java tem um char[] dentro (um array de char). Geralmente chamamos isso de buffer, se você fizer um "Batata".getBytes(), vai retornar um array de bytes de conteúdo {66, 97, 116, 97, 116, 97}, que é na verdade esse char[] que comentei. Note que esse array é a representação ASCII dos caracteres.

Na classe StringBuilder, você além de poder retornar esse buffer, você pode modificar ele, essa é a principal diferença, isso torna os Objetos do tipo String imutáveis, e os objetos do tipo StringBuilder mutáveis.

Olhe o código fonte da classe String e da classe StringBuilder abaixo:
http://www.docjar.com/html/api/java/lang/String.java.html
http://www.docjar.com/html/api/java/lang/AbstractStringBuilder.java.html

Procure por char[] e veja que ambas tem, só que o StringBuilder modifica ele.

1 curtida

ok, obrigado

Na verdade não é bem isso. O array de char não necessariamente é o mesmo que o array de byte, pois o retorno de getBytes() depende do encoding default que está configurado na JVM.

Por exemplo, este código simples:

String s = "Batata";
for (byte b : s.getBytes()) {
    System.out.printf("%d ", b);
}

Na minha JVM o resultado foi 66 97 116 97 116 97, o que seria o “esperado”. Mas se eu mudar o encoding da JVM para UTF-16, por exemplo (veja aqui como mudar essa configuração), o resultado passa a ser -2 -1 0 66 0 97 0 116 0 97 0 116 0 97 (a saber, o encoding padrão que usei no primeiro resultado é UTF-8, que é retro-compatível com ASCII).

Para entender melhor o que são os encodings e porque a mesma string pode resultar em bytes diferentes dependendo da codificação usada, sugiro que leia aqui e aqui. Isso também ajudará a entender porque quando a string só tem caracteres ASCII, os valores são os mesmos do que em UTF-8.

Agora, se eu usar o array de char em vez do de byte:

for (char c: s.toCharArray()) {
    System.out.printf("%d ", (int) c);
}

O resultado sempre é o mesmo, independente do encoding. Isso porque internamente o Java guarda o array de char em UTF-16, e este é retornado assim, independente do encoding que estiver configurado na JVM. Mas quando você chama getBytes(), esses caracteres são convertidos em bytes usando as regras do encoding default que estiver configurado na JVM (obs: é possível sobrescrever esta configuração e usar um encoding específico fazendo algo como s.getBytes(Charset.forName("UTF-8"))).


esse array é a representação ASCII dos caracteres

Na verdade não, pois você pode ter caracteres que vão além do ASCII:

String s = "💩年á"; // sim, um emoji direto na String
for (String encoding : Arrays.asList("UTF-8", "UTF-16", "UTF-32")) {
    System.out.print("\n" + encoding + ": ");
    for (byte b : s.getBytes(Charset.forName(encoding))) {
        System.out.printf("%d ", b);
    }
}
System.out.print("\nchar: ");
for (char c : s.toCharArray()) {
    System.out.printf("%d ", (int) c);
}

Eu coloquei um emoji, um kanji e um caractere acentuado na string. Depois imprimi os bytes em diferentes encodings e também o array de char. A saída é:

UTF-8: -16 -97 -110 -87 -27 -71 -76 -61 -95 
UTF-16: -2 -1 -40 61 -36 -87 94 116 0 -31 
UTF-32: 0 1 -12 -87 0 0 94 116 0 0 0 -31 
char: 55357 56489 24180 225 

Enfim, tudo isso é para falar que getBytes não é o mesmo que o array de char que está dentro da string (às vezes, se você só usar caracteres ASCII, poderão ser iguais, mas nem sempre isso é verdade).


De qualquer forma, não ficou claro o que é pra fazer. Se é para apenas imprimir os caracteres da string de forma “progressiva”, bastaria usar substring:

String s = "batata";
for (int i = 1; i <= s.length(); i++) {
    System.out.println(s.substring(0, i));
}

A saída é:

b
ba
bat
bata
batat
batata

Nem precisa manipular o array de char, nem criar outras strings, nem nada (tudo bem que cada chamada de substring acaba criando outra String, mas enfim).


Outro detalhe é que no seu código você cria dois Scanner's, ambos lendo do System.in, mas não precisa. Basta criar apenas um fora do while e pronto. E eu também tiraria esse else vazio, que é totalmente desnecessário e só acrescenta ruído ao código:

boolean continuar = true;
char opcao;
Scanner entrada = new Scanner(System.in);
while (continuar) {
    String palavra = entrada.next();
    while (!palavra.isEmpty()) {
        palavra = palavra.replaceAll("_", " ");
        System.out.println(palavra);
        if (!palavra.isEmpty())
            palavra = palavra.substring(1);
    }
    System.out.println("Digite 'p' para parar: ");
    opcao = entrada.next().charAt(0);
    if (opcao == 'p') {
        continuar = false;
        System.out.println("Finalizado");
    }
}

Outro detalhe é que não precisa fechar o System.in - leia aqui para entender melhor.

2 curtidas