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á
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á
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.
Os problemas encontrado na sua pergunta:
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
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.
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.