[Resolvido] Dúvidas com para ultilizar Comparator

14 respostas
R

Pessoal,

Estou tendo algumas dúvidas ao implementar a minha classe comparator!

estou tentando fazer algo bem simples mas preciso de uma ajuda de vcs!

Vou armazenando valores em um ArrayList e apos a quinta inclusão no array eu paro e ele exibe todos os meus registros ordenados pelo atributo Peso do objetos inserido no array: (decrescente)

Será que alguem poderia dar uma força :)
Desde ja muito Obrigado

NO MAIN:
package br.com.caelum.teste;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;

import javax.swing.JOptionPane;

import org.omg.CORBA.TypeCodePackage.BadKind;

public class TestaBoi {

	public static void main(String[] args) {

		try {

			int limite = 2;
			int cont = 0;
			ArrayList Boi = new ArrayList();

			for (int i = 0; i < limite; i++) {
				cont++;

				int cod = cont;

				String carga = JOptionPane.showInputDialog("Boi número: " + cod
						+ "\nEntre com o Peso: ");
				int pes = Integer.parseInt(carga);

				String name = JOptionPane.showInputDialog("Boi número: " + cod
						+ "\nEntre com o Nome: ");

				Boi Bois = new Boi(cod, pes, name);

				Boi.add(Bois);

				System.out.println(Boi.get(i));

				if (cod == 5) {
					Collections.sort(Boi);
					System.out.println(Boi);

				}

			}

		} catch (Exception e) {

		}

	}
}
CLASSE COMPARABLE:
package br.com.caelum.teste;

public interface Comparable<T> {
	public int compareTo(T o);
}
CLASSE BOI:
package br.com.caelum.teste;

import java.util.ArrayList;

import javax.print.attribute.standard.MediaSize.Other;
import javax.swing.JOptionPane;

public class Boi implements Comparable {

	int code;
	int peso;
	String nome;

	public Boi(int code, int peso, String nome) {
		super();
		this.code = code;
		this.nome = nome;
		this.peso = peso;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public int getPeso() {
		return peso;
	}

	public void setPeso(int peso) {
		this.peso = peso;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	// ***************************************************** //

	public String toString() {
		return "Codigo: " + code + "\nPeso: " + peso + "\nNome: " + nome + "\n";
	}

	public int compareTo(Object o) {

		if (this.peso > peso) {
			return -1;
		} else {
			if (this.peso < peso) {
				return 1;
			} else {
				return 0;
			}
		}

	}

}

Onde estou errando pessoal???
Vaaaleuu desde já.

14 Respostas

R

Na classe Main você precisa ordenar a coleção, não o objeto:

Collections.sort(Bois);

E no método compareTo() da classe Boi, você não está consultando os dados do Objeto , apenas os dados do próprio objeto. O correto seria:

public int compareTo(Object o) {  
       Boi outro = (Boi) o;
   
         if (outro.peso > peso) {  
             return -1;  
         } else {  
             if (outro.peso < peso) {  
                 return 1;  
             } else {  
                 return 0;  
             }  
         }  
     }
R

oi Roger! blza cara

fiz as alterações que vc sugerio na meu compareTo

Porem quando eu coloco:

Collections.sort(Bois);

ele da um erro no meu SORT e pede para colocar um (Casting)

R

Sinto muito Roberto, deveria ter checado melhor antes de postar, mas vamos lá. Na linha 20 da classe Main, você está criando uma lista chamada :

ArrayList Boi = new ArrayList();

Recomendo renomear essa variável de para ou algo parecido, já que é o nome de uma classe, e isso certamente causará uma grande confusão a quem tiver de ler o seu código. Continuando, na linha 34 da classe Main, você está criando um Boi chamado Bois:

Boi Bois = new Boi(cod, pes, name);

Recomendo renomear de para , já que se trata de um objeto único e não de uma coleção. Por fim, na linha 41, em que você está efetivamente ordenando a lista:

Collections.sort(Boi);

você terá de usar:

Collections.sort(lista);

Espero que funcione desta vez…

moacirjava

Vê se isso te ajuda…

import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JOptionPane;

public class TesteBoi {

	public static void main(String[] args) {
        try {
			int limite = 5;
			int cont = 0;
			ArrayList<Boi> Boi = new ArrayList<Boi>();

			for (int i = 0; i < limite; i++) {
				cont++;
				int cod = cont;

				String carga = JOptionPane.showInputDialog("Boi número: " + cod
						+ "\nEntre com o Peso: ");
				int pes = Integer.parseInt(carga);

				String name = JOptionPane.showInputDialog("Boi número: " + cod
						+ "\nEntre com o Nome: ");

				Boi Bois = new Boi(cod, pes, name);

				Boi.add(Bois);

				System.out.println(Boi.get(i));
                Compara c = new Compara();

				if (cod == 5) {
					Collections.sort(Boi, c);
					System.out.println(Boi);
				}
			}
		} catch (Exception e) {
            e.printStackTrace();
		}
	}
}


class Boi implements Comparable<Boi>{
    int cod, pes; String name;
    public Boi(int cod, int pes, String name){
        this.cod = cod;
        this.pes = pes;
        this.name = name;
    }

    public int compareTo(Boi o) {
        return name.compareTo(o.name);
    }

    public String toString(){
        return "Boi nome: " + name + " e peso: " + pes;
    }
}
import java.util.Comparator;

public class Compara implements Comparator<Boi> {

    public int compare(Boi obj1, Boi obj2) {
        return obj1.name.compareTo(obj2.name);
    }
}
R

Pessoal,

fiz as alterações sugeridas pelo pessoal e dei uma analizada no cod. mas mesmo assim não estou conseguindo ordenar meus objetos pelo atributo peso.

segue o cod que fiz com a ajuda dos caras, alias obrigado a todos pela força...

CLASSE MAIN:

package br.com.caelum.teste;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.swing.JOptionPane;

public class TestaBoi {

	public static void main(String[] args) {

		ArrayList lista = new ArrayList();

		try {

			int limite = 10;
			int cont = 0;

			for (int i = 0; i < limite; i++) {
				cont++;

				int cod = cont;

				String carga = JOptionPane.showInputDialog("Boi número: " + cod
						+ "\nEntre com o Peso: ");
				int pes = Integer.parseInt(carga);

				String name = JOptionPane.showInputDialog("Boi número: " + cod
						+ "\nEntre com o Nome: ");

				Boi boi = new Boi(cod, pes, name);

				lista.add(boi);
				System.out.println(lista.get(i));

				if (cod == 5) {
					for (int a = 0; a < lista.size(); a++) {
						Collections.sort(lista);
						System.out.println(lista.get(i));
					}

				}

			}

		} catch (Exception e) {

		}

	}

}

CLASSE BOI:

package br.com.caelum.teste;

import java.util.ArrayList;

import javax.swing.JOptionPane;

public class Boi implements Comparable {

	int code;
	int peso;
	String nome;

	public Boi(int code, int peso, String nome) {
		super();
		this.code = code;
		this.nome = nome;
		this.peso = peso;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public int getPeso() {
		return peso;
	}

	public void setPeso(int peso) {
		this.peso = peso;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	// ***************************************************** //

	public String toString() {
		return "Codigo: " + code + "\nPeso: " + peso + "\nNome: " + nome + "\n";
	}

	public int compareTo(Object o) {
		Boi outro = (Boi) o;

		if (outro.getPeso() > this.peso) {
			return -1;
		} else {
			if (outro.getPeso() < this.peso) {
				return 1;
			} else {
				return 0;
			}
		}
	}

}

CLASSE COMPARABLE:

package br.com.caelum.teste;   
  
public interface Comparable<T> {   
    public int compareTo(T o);   
}

Desde já, obrigado pessoal

moacirjava

A classe Comparator não ordena tipos primitivos.
Troque esse seu int por Integer.

Marky.Vasconcelos

Voce não precisa criar a classe Comparable… ela já é do java. Apague essa sua e use a classe java.lang.Comparable.

R

entao pessoal,

ja fiz ambas as coisas

ta rolando essa exceção

Exception in thread "main" java.lang.ClassCastException: br.com.caelum.teste.Boi cannot be cast to java.lang.Comparable at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at java.util.Collections.sort(Unknown Source) at br.com.caelum.teste.TestaBoi.main(TestaBoi.java:47)

Marky.Vasconcelos

Entao deixa sua classe assim.

public class Boi implements java.lang.Comparable<Boi> {

Só isso que é o problema… apaga sua classe Comparable que voce criou… voce esta implementando ela não a do Java.

R

Mas cara se faço isso!

rola um erro na meu metodo:

public int compareTo(Object o) {
		Boi outro = (Boi) o;

		if (outro.getPeso() > this.peso) {
			return 1;
		} else {
			if (outro.getPeso() < this.peso) {
				return -1;
			} else {
				return 0;
			}
		}
	}

e no nome da minha classe:

public class Boi implements java.lang.Comparable<Boi> {

=/

R

Vaaaleuu cara! era isso mesmo!

Funcionou perfeitamente!

Obrigado pela força de todos!

abraço

Marky.Vasconcelos

Que erro? Voce testou antes de postar?

R

Sem erros cara!

FUNCIONOU TUDO! testado

Muito obrigadoo!

abraxx!

A

Fiz os testes… Pois estou estudando Camparator… Afinal com é a finalidade dele (Camparator)?

abraço,

AS

Criado 30 de abril de 2009
Ultima resposta 3 de mai. de 2010
Respostas 14
Participantes 5