[RESOLVIDO] Combinações

4 respostas
Onimatsu

Boa noite pessoal.
Estou fazendo o exercício com o enunciado:
Crie um aplicativo que receba uma palavra de 10 letras (se for menor deve ser completada com A, B, C, D, .. até 10 caracteres, se maior deve ser cortada) e imprima todas as combinações (de 2 caracteres) com as letras da palavra informada.
ABCDEFGHIJ => AA, AB, AC, ..., IJ, JJ

Então eu fiz desse jeito:
package extras01;

import javax.swing.JOptionPane;

public class Ex12_string {

    public static void main(String[] args) {
        String vet[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
        String palavra = JOptionPane.showInputDialog(null, "Digite uma palavra "), combinacoes = "";
        char arrayCaracter[] = palavra.toCharArray();
        int cont = 0;

        while (palavra.length() < 10) {
            palavra = palavra.concat(vet[cont]).toUpperCase();
            cont++;
        }
        if (palavra.length() > 10) {
            palavra = palavra.substring(0, 10).toUpperCase();
        }

        cont = 0;
        while (palavra.length() > cont) {
            for (int i = 0; i < palavra.length(); i++) {
                combinacoes += Character.toString(palavra.charAt(cont)) + (Character.toString(arrayCaracter[i])) + ", ";
            }
            cont++;
        }
    }
}
O problema acontece na parte de fazer as combinações de 2 caracteres AA, AB, AC, ..., IJ, JJ o erro ArrayIndexOutOfBoundsException ocorre entre as linhas 23 e 24 mas não consigo identificar. Qual é o erro da minha lógica?

4 Respostas

BrunoFurtado

Opa,

O problema é que o tamanho da String palavra esta sendo alterado…
Enquanto isso, o tamanho do arrayCaracter continua o mesmo.

Digitando uma palavra com 6 caratecteres, por exemplo, a String palavra será modificada e passará a ter tamanho 10…
O arrayCaracter continuará com tamanho 6…
Ao percorrer o while na linha 22 vai rolar erro pois o arrayCaracter não tem valores para 7,8,9 e 10.

Eu tentaria incluir o seguinte código na linha 20:
arrayCaracter = palavra.toCharArray();

Veja ai qq rola…
Abraço.

BrunoFurtado

Manda imprimir a String combinacoes pra visualizar o resultado…

W

Opa, como você tentou fazer o código, vou explicar diretamente com um modelo corrigido e melhorado. Com certeza você aprenderá muito mais do que eu falar uma monte de bla, bla, bla sem necessidade no seu caso:

public static void main(String[] args) {

    	final String COMPLEMENTO = "ABCDEFGHIJ";
    	
        String sInput = JOptionPane.showInputDialog("Digite uma palavra", null);
        String sInputTratado = (sInput==null? "": sInput).toUpperCase().concat(COMPLEMENTO).substring(0, 10); 
        
        char arrayChar[] = sInputTratado.toCharArray();
        char par[] = new char[2];

        for (char charPrincipal: arrayChar) {
        	par[0] = charPrincipal;
            for (char charCombinado: arrayChar) {
            	par[1] = charCombinado;
            	System.out.format("%c%c", par[0], par[1]);
            }
        	System.out.print("\n");
        }

   }

Boa sorte. Continue empenhado em Java, vale muito a pena.

wiliamps

Onimatsu
Obrigado rapaziada. Nunca imaginei que o erro do código estava no arrayCaracter então eu tinha que associar ele a palavra.toCharArray depois do primeiro laço while onde ocorre o tratamento valeu Bruno. E wiliamps vou me empenhar mais em java e estudar um pouco o seu código até porque têm algumas coisas que eu ainda não vi e meu debug ainda é falho, mas, por enquanto o código fica assim:
package extras01;

import javax.swing.JOptionPane;

public class Ex12_string {

    public static void main(String[] args) {
        String vet[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
        String palavra = JOptionPane.showInputDialog(null, "Digite uma palavra "), combinacoes = "";
        int cont = 0;

        while (palavra.length() < 10) {
            palavra = palavra.concat(vet[cont]).toUpperCase();
            cont++;
        }
        if (palavra.length() > 10) {
            palavra = palavra.substring(0, 10).toUpperCase();
        }

        cont = 0;
        char arrayCaracter[] = palavra.toCharArray();

        while (palavra.length() > cont) {
            for (int i = 0; i < palavra.length(); i++) {
                combinacoes += Character.toString(palavra.charAt(cont)) + (Character.toString(arrayCaracter[i])) + "\n";
            }
            cont++;
        }
        System.out.printf("%s", combinacoes);
    }
}
Vlw!
Criado 2 de outubro de 2012
Ultima resposta 3 de out. de 2012
Respostas 4
Participantes 3