Lógica: Programa executa mas não retorna mensagem esperada

3 respostas
lisasf

[b]Ola.
Preciso transformar os caracteres de uma mensagem em maiúsculos e minúsculos intercaladamente,
com o detalhe de cada palavra iniciar com caracter maiúsculo.
Programei o seguinte código, no entanto ele não esta retornando a mensagem modificada, apenas:

?BUILD SUCCESSFUL (total time: 1 second)?

Ex: mensagem = alguma frase minha deve estar aqui
Retorno esperado=AlGuMa FrAsE MiNhA DeVe EsTaR AqUi

Estou usando o Netbeans. Testei o código nas versões 7.0 e 6.9 e obtive o mesmo resultado em ambas.
Será que é algum erro de lógica?[/b]

import java.lang.String.*;
import com.sun.xml.internal.ws.util.StringUtils;


public class IntercalarMaiusculoMinusculo {
     public static void main(String[] args) {

       String mensagem = ("uma frase aqui");
       String resultado = Intercalar(mensagem);
       System.out.println(resultado);

    }


public static String Intercalar(String msg)

{
        String saida = "";//declara e incializa a string de retorno
       
        String[] palavras = msg.split(" ");//cada posição do array recebe uma palavra da mensagem (ordenadamente)
        //split() separa a string utilizando como critério o delimitador retornando um array


        for (int i = 0; i>= palavras.length; i++) // percorre as posições do array de palavras
        {
          palavras[i]=StringUtils.capitalize(palavras[i]); // capitaliza as palavras de cada posição// OBS: posso omitir essa linha!
          String[] letras = palavras[i].split(""); // as letras de casa palavra são separadas aqui
            for (int j = 0; j>=letras.length; j++) // percorre as posições do array de letras
            {
                // OBS: sempre a posição par será maiúsculo e a impar minusculo, uma vez que toda palavra inicializa com caracter maiúsculo
                if(j%2==0){ // se posição par torna maiúsculo
                    letras[j]=StringUtils.capitalize(letras[j]);                       
                }
                if (j%2!=0){ // se posição ímpar torna minúsculo
                    letras[j]=(letras[j]).toString().toLowerCase();
                }
                saida += letras[j]; // concatena as letras de cada palavra na string de retorno
            }
            saida +=  " ";// acrescenta um espaco entre cada palavra

        }
        return (saida);
    }
}

3 Respostas

ViniGodoy

Provavelmente. Tentou executar o código no depurador de netbeans, passo-a-passo? É a melhor forma de encontrar e detectar erros de lógica.

ViniGodoy

Sua lógica está certa, você errou mesmo alguns detalhes na sintaxe:
1. Você invertou a condição do for;
2. Você não deve usar a classe StringUtils. No lugar, use Character.toUpperCase e Character.toLowerCase;
3. Você não deve concatenar Strings dentro de for. Embora isso funcione, é extremamente lento e ineficiente. Como já vi que vc usou a classe StrinngBuilder em outro tópico, sugiro que a use-a aí também;
4. Quando possível, use o for-each no lugar do for convencional. Ele evita o erro que você cometeu e deixa a lógica mais simples.

Aqui vai o seu código corrigido:
public class IntercalarMaiusculoMinusculo {
     public static void main(String[] args) {
       String mensagem = ("uma frase aqui");
       String resultado = Intercalar(mensagem);
       System.out.println(resultado);
    }

public static String Intercalar(String msg) {
        StringBuilder saida = new StringBuilder();//Declara um StringBuilder para o retorno
       
        String[] palavras = msg.split(" ");//cada posição do array recebe uma palavra da mensagem (ordenadamente)
        //split() separa a string utilizando como critério o delimitador retornando um array


        for (String palavra : palavras) { //Para cada palavra no array de palavras
            for (int i = 0; i < palavra.length(); i++) { // Para cada letra na palavra
                // OBS: sempre a posição par será maiúsculo e a impar minusculo, uma vez que toda palavra inicializa com caracter maiúsculo
                if(i%2==0){ // se posição par torna maiúsculo
                	saida.append(Character.toUpperCase(palavra.charAt(i)));                                
                } else { // se posição ímpar torna minúsculo
                	saida.append(Character.toLowerCase(palavra.charAt(i))); 
                }                
            }
            saida.append(" ");// acrescenta um espaco entre cada palavra

        }
        return saida.toString();
    }
}

Note que evitei os 2 ifs usando um else. E também exclui a linha que vc mesma comentou que poderia ser excluída (não tem pq fazer processamento inútil).

lisasf

ViniGodoy Muito obrigada novamente. Agora obtive o resultado esperado. :stuck_out_tongue:

Criado 30 de abril de 2011
Ultima resposta 30 de abr. de 2011
Respostas 3
Participantes 2