Metodo compareTo

5 respostas Resolvido
java
jairodione

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?

5 Respostas

lvbarbosa

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.

staroski

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;
}
jairodione

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!); // <strong>ELE CAI AQUI</strong>

}

}//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!

A
Solucao aceita

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.

jairodione

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!!!

Criado 4 de julho de 2017
Ultima resposta 5 de jul. de 2017
Respostas 5
Participantes 4