Quero desenvolver uma demonstração de classificação para a lista de carros. Estou usando a tabela de dados para exibir a lista de carros. Na verdade, quero classificar a lista pela cor do carro. Aqui, não é classificado por ordem alfabética. Quero usar minha ordem de classificação personalizada, como Carro vermelho vem primeiro, depois Azul etc.
Para isso tento usar Java Comparator
e Comparable
mas permite ordenar apenas em ordem alfabética.
Então, alguém pode me orientar na forma de implementar a técnica a ser utilizada para que a triagem seja mais rápida.
class Car implements Comparable<Car>
{
private String name;
private String color;
public Car(String name, String color){
this.name = name;
this.color = color;
}
//Implement the natural order for this class
public int compareTo(Car c) {
return name.compareTo(c.name);
}
static class ColorComparator implements Comparator<Car> {
public int compare(Car c1, Car c2) {
String a1 = c1.color;
String a2 = c2.color;
return a1.compareTo(a2);
}
}
public static void main(String[] args) {
List<Car> carList = new ArrayList<>();
List<String> sortOrder = new ArrayList<>();
carList.add(new Car("Ford","Silver"));
carList.add(new Car("Tes","Blue"));
carList.add(new Car("Honda","Magenta"));
sortOrder.add("Silver");
sortOrder.add("Magenta");
sortOrder.add("Blue");
// Now here I am confuse how to implement my custom sort
}
}
enum
valores é a ordem em que seus valores são definidos.Que tal agora:
Em princípio, concordo que usar um
enum
é uma abordagem ainda melhor, mas esta versão é mais flexível, pois permite definir diferentes ordens de classificação.Atualizar
O Guava tem esta funcionalidade embutida em sua
Ordering
classe:Esta versão é um pouco menos prolixa.
Atualizar novamente
Java 8 torna o Comparator ainda menos prolixo:
fonte
Comparador em linha ...
fonte
Acho que isso pode ser feito da seguinte maneira:
Para classificação, use isto:
fonte
Eu tive que fazer algo semelhante à resposta de Sean e ilalex.
Mas eu tinha muitas opções para definir explicitamente a ordem de classificação e só precisava flutuar certas entradas para a frente da lista ... na ordem especificada (não natural).
Espero que isso seja útil para outra pessoa.
fonte
Vou fazer algo assim:
Todos os créditos vão para @Sean Patrick Floyd :)
fonte
No Java 8, você pode fazer algo assim:
Você precisa primeiro de um Enum:
Classe de carro:
E então, usando sua lista de carros, você pode simplesmente fazer:
fonte
Defina um tipo de Enum como
Alterar tipo de dados
color
a partirString
deColors
alteração tipo de retorno e tipo de argumento de getter e setter método de cor paraColors
Defina o tipo de comparador como segue
depois de adicionar elementos a Lista, chame o método de classificação de Coleção passando objetos de lista e comparador como argumentos
ou seja,
Collections.sort(carList, new ColorComparator());
imprima usandoListIterator
.a implementação completa da classe é a seguinte:
fonte
Usando apenas loops simples:
E ordem de classificação na lista
fonte