Alternar caracteres em uma String

6 respostas
F

Olá pessoal, estou com uma questão para resolver que diz o seguinte :

Construa um programa que substitua todas as letras de uma dada frase por maiúsculas e minúsculas, alternadamente.

Ex: EsTe É uM eXeMpLo De CoMo DeVeRá FiCaR a FrAsE dIgItAdA. NoTe QuE oS eSpAçOs Em BrAnCo DeVeM sEr IgNoRaDoS.

Não estou conseguindo realizar a alternação entre caracteres para deixar uma maiúscula e a sucessora minuscula, entretanto consigo deixar a primeira letra de qualquer frase fornecida pelo usuário maiuscula:

=========================================================================================================================================

public static void main(String[] args) {
	
	Scanner palavra = new Scanner(System.in);
	String frase = palavra.nextLine();
	 
	System.out.println(frase.substring(0,1).toUpperCase() + frase.substring(1) );

}

}

=========================================================================================================================================
Atc, Felipe

6 Respostas

novato25
Veja se isto te ajuda:
public class Main {

	private static final char ESPACO = ' ';

	public static void main(String[] args) {
		String texto = "EsTe É uM eXeMpLo De CoMo DeVeRá FiCaR a FrAsE dIgItAdA. NoTe QuE oS eSpAçOs Em BrAnCo DeVeM sEr IgNoRaDoS.";
		
		StringBuilder novoTexto = new StringBuilder();
		
		boolean textoComecaComMaiuscula = Character.isUpperCase(texto.charAt(0));

		for (int i=0; i < texto.length(); i++) {
			Character c = texto.charAt(i);
			
			if(c.charValue() == ESPACO) {
				novoTexto.append(c);
				textoComecaComMaiuscula = alternarMaiusculoMinusculo(textoComecaComMaiuscula);
				continue;
			}
			
			if(textoComecaComMaiuscula) {
				if(isNumeroPar(i))
					novoTexto.append(toLowerCase(c));
				else
					novoTexto.append(toUpperCase(c));		
			} else {
				if(isNumeroPar(i))
					novoTexto.append(toUpperCase(c));		
				else
					novoTexto.append(toLowerCase(c));
			}
		}
		
		System.out.println(novoTexto);
	}

	private static String toUpperCase(Character c) {
		return c.toString().toUpperCase();
	}

	private static String toLowerCase(Character c) {
		return c.toString().toLowerCase();
	}

	private static boolean alternarMaiusculoMinusculo(boolean textoComecaComMaiuscula) {
		return textoComecaComMaiuscula? false : true;
	}

	private static boolean isNumeroPar(int i) {
		return i%2 == 0;
	}
}
Rodrigo_Sasaki
Que tal um exemplo um pouco mais compacto? :)
public class Miguxeitor{
	
	public static void main(String[] args) {
		String str = "este é um exemplo de como deverá ficar a frase digitada. note que os espaços em branco devem ser ignorados";
		System.out.println(miguxate(str));
	}
	
	public static String miguxate(String str){
		str = str.toLowerCase();
		StringBuilder builder = new StringBuilder();
		boolean upperCase = false;
		for (char c : str.toCharArray()){
			if (Character.isLetter(c)){
				builder.append(upperCase ? c : (char)(c - 32)); 
				upperCase = !upperCase;
			} else{
				builder.append(c);
			}
		}
		return builder.toString();
	}
	
}
A

Creio que o melhor algoritmo para fazer isso se encontra aqui:

http://stackoverflow.com/questions/3292952/uppercase-random-number-of-characters-from-a-random-alphanumeric-string

Utilizando distribuicao binomial para a probabilidade aleatoria.

Esta tudo explicado no post de Eyal Schneider.

Rodrigo_Sasaki

andrielc:
Creio que o melhor algoritmo para fazer isso se encontra aqui:

http://stackoverflow.com/questions/3292952/uppercase-random-number-of-characters-from-a-random-alphanumeric-string

Utilizando distribuicao binomial para a probabilidade aleatoria.

Esta tudo explicado no post de Eyal Schneider.


Mas probabilidade aleatória não se aplica aqui. A regra dele é fixa. se a letra atual é maiúscula a próxima letra invariavelmente não pode ser.

novato25

Muito bom o seu código, Rodrigo. Só não entendi o nome da classe… hauhauhau…

Rodrigo_Sasaki

Hahahaha, é que ele me lembrou disso aqui: http://www.coisinha.com.br/miguxeitor/

Criado 11 de abril de 2013
Ultima resposta 11 de abr. de 2013
Respostas 6
Participantes 4