Re:Collections.sort

3 respostas
T

Esse erro é um pouco cabeludo porque tem herança no meio. Não sei resolver assim de cor, vou fazer uns testes depois do almoço.

3 Respostas

T

Dica: em vez de implementar Comparable, muitas vezes é melhor usar um Comparator mesmo. Depende do seu gosto.

import java.util.*;

class VeiculoTO implements Comparable<VeiculoTO>{
    public VeiculoTO (String pMarca) { marca = pMarca; }
    private String marca;
    public String getMarca() { return marca; }
    public int compareTo (VeiculoTO v) {
        return this.marca.compareTo (v.getMarca());
    }
    public String toString() { return "<marca = " + marca + ">"; }
}

// Note que "Comparable" não pode ser implementada duas vezes, com parâmetros diferentes!
// O codigo a seguir não compila.
/*
class VeiculoNovoTO extends VeiculoTO implements Comparable<VeiculoNovoTO>{
    public VeiculoNovoTO (String pMarca, String pModelo) {
        super (pMarca);
        modelo = pModelo;
    }
    private String modelo; // 
    public String getModelo() { return modelo; }
    public int compareTo (VeiculoNovoTO v) {
        return this.modelo.compareTo (v.getModelo());
    }
    public String toString() { return "<marca = " + getMarca() + ", modelo = " + modelo + " >"; }
}
*/
// O código a seguir compila, mas isso irã requerer um Comparator.
class VeiculoNovoTO extends VeiculoTO {
    public VeiculoNovoTO (String pMarca, String pModelo) {
        super (pMarca);
        modelo = pModelo;
    }
    private String modelo; // 
    public String getModelo() { return modelo; }
    public String toString() { return "<marca = " + getMarca() + ", modelo = " + modelo + " >"; }
}


class ExemploCollectionsSort {
    public static void main(String[] args) {
        ArrayList<VeiculoTO> veiculos = new ArrayList<VeiculoTO>();
        // Note que se algum dos elementos de Veiculos for VeiculoTO, não
        // VeiculoNovoTO, não se pode usar a comparação por modelo.
        // Só dá para fazer a comparação por marca.
        veiculos.add (new VeiculoTO ("GM"));
        veiculos.add (new VeiculoNovoTO ("Fiat", "Palio"));
        
        Collections.sort (veiculos);
        System.out.println (veiculos);
        
        ArrayList<VeiculoNovoTO> veiculosNovos = new ArrayList<VeiculoNovoTO>();
        veiculosNovos.add (new VeiculoNovoTO ("Fiat", "Idea"));
        veiculosNovos.add (new VeiculoNovoTO ("GM", "Corsa"));
        Collections.sort (veiculosNovos, new Comparator<VeiculoNovoTO> () {
            public int compare (VeiculoNovoTO v1, VeiculoNovoTO v2) {
                return v1.getModelo().compareTo (v2.getModelo());
            }
        });
        System.out.println (veiculosNovos);
    }
}
Kamikaze

ola alguem pode me ajudar?

tenho uma classe veiculoTO onde a classe VeiculoNovoTO extends VeiculoTO implements Comparable

/**
 * Compara dois veículos.
 * 
 * @param objeto
 *            veículo a comparar
 * @return resultado da comparação
 * @see #getModelo()
 */
public int compareTo(VeiculoNovoTO veiculoNovoTO) {		
	return getModelo().compareTo(veiculoNovoTO.getModelo());
}

Na controller estou com esse erro na Collections

Bound mismatch: The generic method sort(List) of type Collections is not applicable for the
arguments (ArrayList). The inferred type VeiculoTO is not a valid substitute for the
bounded parameter <T extends Comparable<? super T>>

ArrayList veiculos = new ArrayList(this.veiculos .values());

Collections.sort(veiculos);

agradeço desde já

Kamikaze

Valeu kra a ajuda…consegui resolver o problema…

Criei uma classe Comparador
public class Comparador{

/**
 * Compara dois veiculos e o ordena em ordem Alfabetica
 * 
 * @author Márcio André Ishida
 * @param <T>
 * @return (Comparator<T>) ALFABETICA_ORDER
 * @since 1.1
 */
public static <T> Comparator<T> AlfabeticaComparator() {
    return (Comparator<T>) ALFABETICA_ORDER;
}

private static final Comparator ALFABETICA_ORDER = new AlfabeticaComparator();

private static class AlfabeticaComparator<T>
implements Comparator<VeiculoNovoTO>{

    public int compare(VeiculoNovoTO c1, VeiculoNovoTO c2) {
        return c1.compareTo(c2);
    }
}

}

e na classe controller coloquei assim

ArrayList<VeiculoTO> veiculos = new ArrayList<VeiculoTO>(this.veiculos
			.values());
	
	Collections.sort(veiculos,Comparador.AlfabeticaComparator());

Num sei se eh o certo mas ta funcionando

vlw a ajuda

Criado 20 de julho de 2006
Ultima resposta 20 de jul. de 2006
Respostas 3
Participantes 2