Metodo compareTo

Olá Pessoal!

Estou tentando ordenar caracteres, fiz da seguinte forma:

public static void bolhaf(char palavras[]) {
    char x;
    for (int i = 1; i < palavras.length; i++) {
        for (int j = palavras.length - 1; j >= 1; j--) {
            if (palavras[j - 1].compareTo(palavras[j]) > 0) {
                x = palavras[j - 1];
                palavras[j - 1] = palavras[j];
                palavras[j] = x;
            }
        }
    }
}

da forma como o método esta descrito acima não funciona para o tipo char, se eu mudar o parâmetro para String, funciona normalmente!

Como faço para corrigir isto?

char é um tipo primitivo e não possui métodos. Pode usar o Character, ao invés de char.

Obs: não existe autoboxing de array de primitivos para array de objetos. A conversão tem que ser manual.

Não precisa usar Character, é um overhead desnecessário.

O método compareTo das classes Comparable deve sempre retornar a diferença do objeto em si em relação ao objeto passado como parâmetro.

Partindo desse princípio, para calcular a diferença dos tipos primitivos char, short, int, float, long e double basta usar o operador menos, afinal o resultado de uma subtração é chamado de diferença:

Então, ao invés de fazer assim:

if (palavras[j - 1].compareTo(palavras[j]) > 0) {
	x = palavras[j - 1];
	palavras[j - 1] = palavras[j];
	palavras[j] = x;
}

Faça assim:

if ( (palavras[j - 1] - palavras[j]) > 0) {
	x = palavras[j - 1];
	palavras[j - 1] = palavras[j];
	palavras[j] = x;
}
1 curtida

Olá staroski!

Quase que funcionou. O que acontece é que ele cai na exceção, o código está abaixo:

public static void bolhaf(char palavras[]) {
char x;
for (int i = 1; i < palavras.length; i++) {
for (int j = palavras.length - 1; j >= 1; j–) {
if ((palavras[j - 1] - palavras[j]) > 0) {
x = palavras[j - 1];
palavras[j - 1] = palavras[j];
palavras[j] = x;
}
}
}
}

código do programa principal:

public static void main(String args[]) {
int opcao, qte;
String num, saida = "| ";
//char num1;
boolean ok;
try {
do {
num = JOptionPane.showInputDialog(
“Ordenar\n”
+ “Digite a opção para ordenar:\n”
+ “1 - Numeros Decimais\n”
+ “2 - Caracteres\n”);
opcao = Integer.parseInt(num);
switch (opcao) {
case 1:
num = JOptionPane.showInputDialog(“Quantos numeros?”);
qte = Integer.parseInt(num);
float numeros[] = new float[qte];
for (int i = 0; i < qte; i++) {
num = JOptionPane.showInputDialog(“Numero[” + i + “]”);
numeros[i] = Float.parseFloat(num);
}
Ordenacao.bolhaf(numeros);
for (int i = 0; i < numeros.length; i++) {
saida = saida + numeros[i] + " | ";
}
JOptionPane.showMessageDialog(null, “Numeros Ordenados: \n” + saida);
ok = true;
break;
case 2:
num = JOptionPane.showInputDialog(“Quantos Caracteres?”);
qte = Integer.parseInt(num);
char palavras[] = new char[qte];
for (int i = 0; i < qte; i++) {
num = JOptionPane.showInputDialog(“Caractere[” + i + “]”);
palavras[i] = num.charAt(i);
}
Ordenacao.bolhaf(palavras);
for (int i = 0; i < palavras.length; i++) {
saida = saida + palavras[i] + " | ";
}
JOptionPane.showMessageDialog(null, “Caracteres Ordenados: \n” + saida);
ok = true;
break;
default:
JOptionPane.showMessageDialog(null, “Opção Invalida!\n” + “Tente Novamente!”);
ok = false;
}
} while (!ok);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Ocorreu um erro durante a leitura!”); // ELE CAI AQUI
}
}//fim do metodo construtor

OBS.: QUANDO DIGITO A QUANTIDADE DE CARACTERES E APÓS COMEÇO A DIGITAR O CARACTERE; DIGITO O 1º (TUDO BEM), MAS QUANDO DIGITO O SEGUNDO CARACTERE CAI NA EXCEÇÃO!

Dentro do for, tem um ArrayIndexOutOfBoundsException, previsto na instrução a seguir.
palavras[i] = num.charAt(i);

Altere para palavras[i] = num.charAt(0);

O método de ordenação tem como parâmetro um array de char, e você está passando um tipo diferente, crie outro que receba como parâmetro um array de float e aproveite a estrutura criada.

Ola addiler!

Solucionou meu problema!
Agora com relação a (O método de ordenação tem como parâmetro um array de char, e você está passando um tipo diferente, crie outro que receba como parâmetro um array de float e aproveite a estrutura criada.), fiz desta forma pois no programa principal coloquei a escolha de numero ou caractere, se for numero ele chama o método que utiliza como parâmetro o numero, e sendo caractere ele chama o metodo que utiliza como parâmetro caractere.
O código do programa principal é este que você me orientou a fazer a modificação para funcionar corretamente.
Agora o código que tem os métodos, ou seja as funções ou procedimentos está descrito abaixo:

public class Ordenacao {

public static void bolha(int numeros[]) {
    int x;
    for (int i = 1; i < numeros.length; i++) {
        for (int j = numeros.length - 1; j >= i; j--) {
            if (numeros[j-1] > numeros[j]) {
                x = numeros[j-1];
                numeros[j - 1] = numeros[j];
                numeros[j] = x;
            }
        }
    }
}

public static void bolha(String palavras[]) {
    String x;
    for (int i = 1; i < palavras.length; i++) {
        for (int j = palavras.length - 1; j >= 1; j--) {
            if (palavras[j - 1].compareTo(palavras[j]) > 0) {
                x = palavras[j - 1];
                palavras[j - 1] = palavras[j];
                palavras[j] = x;
            }
        }
    }
}

public static void bolhaf(float numeros[]) {
    float x;
    for (int i = 1; i < numeros.length; i++) {
        for (int j = numeros.length - 1; j >= i; j--) {
            if (numeros[j-1] > numeros[j]) {
                x = numeros[j-1];
                numeros[j - 1] = numeros[j];
                numeros[j] = x;
            }
        }
    }
}

public static void bolhaf(char palavras[]) {
    char x;
    for (int i = 1; i < palavras.length; i++) {
        for (int j = palavras.length - 1; j >= 1; j--) {
            if ((palavras[j - 1] - palavras[j]) > 0) {
                x = palavras[j - 1];
                palavras[j - 1] = palavras[j];
                palavras[j] = x;
            }
        }
    }
}

}

Muito Obrigado addiler!!!