[Resolvido] Dúvidas com para ultilizar Comparator

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 :slight_smile:
Desde ja muito Obrigado

NO MAIN:

[code]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) {

	}

}

}[/code]

CLASSE COMPARABLE:

[code]package br.com.caelum.teste;

public interface Comparable {
public int compareTo(T o);
}[/code]

CLASSE BOI:

[code]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;
		}
	}

}

}[/code]

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

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:

[code] 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;  
         }  
     }  
 }  

[/code]

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)

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…

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

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:

[code]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) {

	}

}

}
[/code]

CLASSE BOI:

[code]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;
		}
	}
}

}
[/code]

CLASSE COMPARABLE:

[code]package br.com.caelum.teste;

public interface Comparable {
public int compareTo(T o);
} [/code]

Desde já, obrigado pessoal

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

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

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)

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.

Mas cara se faço isso!

rola um erro na meu metodo:

[code]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;
		}
	}
}[/code]

e no nome da minha classe:

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

=/

Vaaaleuu cara! era isso mesmo!

Funcionou perfeitamente!

Obrigado pela força de todos!

abraço

Que erro? Voce testou antes de postar?

Sem erros cara!

FUNCIONOU TUDO! testado

Muito obrigadoo!

abraxx!

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

abraço,

AS