Alternar caracteres em uma String

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

Veja se isto te ajuda:

[code]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;
}

}
[/code]

Que tal um exemplo um pouco mais compacto? :)[code]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();
}

}
[/code]

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.

[quote=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.[/quote]
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.

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

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