Si sabe de antemano qué campos usar para hacer la comparación, entonces otras personas dieron respuestas correctas.
Lo que le puede interesar es ordenar su colección en caso de que no sepa en tiempo de compilación qué criterios aplicar. Imagine que tiene un programa trata de ciudades:
protected Set<City> cities;
(...)
Field temperatureField = City.class.getDeclaredField("temperature");
Field numberOfInhabitantsField = City.class.getDeclaredField("numberOfInhabitants");
Field rainfallField = City.class.getDeclaredField("rainfall");
program.showCitiesSortBy(temperatureField, numberOfInhabitantsField, rainfallField);
(...)
public void showCitiesSortBy(Field... fields) {
List<City> sortedCities = new ArrayList<City>(cities);
Collections.sort(sortedCities, new City.CityMultiComparator(fields));
for (City city : sortedCities) {
System.out.println(city.toString());
}
}
que permita cambiar los nombres de campos no modificables por nombres de campo deducidas a partir de una solicitud del usuario en su programa.
En este ejemplo, City.CityMultiComparator<City>
es una clase anidada estática de la clase City
implementar Comparator
:
public static class CityMultiComparator implements Comparator<City> {
protected List<Field> fields;
public CityMultiComparator(Field... orderedFields) {
fields = new ArrayList<Field>();
for (Field field : orderedFields) {
fields.add(field);
}
}
@Override
public int compare(City cityA, City cityB) {
Integer score = 0;
Boolean continueComparison = true;
Iterator itFields = fields.iterator();
while (itFields.hasNext() && continueComparison) {
Field field = itFields.next();
Integer currentScore = 0;
if (field.getName().equalsIgnoreCase("temperature")) {
currentScore = cityA.getTemperature().compareTo(cityB.getTemperature());
} else if (field.getName().equalsIgnoreCase("numberOfInhabitants")) {
currentScore = cityA.getNumberOfInhabitants().compareTo(cityB.getNumberOfInhabitants());
} else if (field.getName().equalsIgnoreCase("rainfall")) {
currentScore = cityA.getRainfall().compareTo(cityB.getRainfall());
}
if (currentScore != 0) {
continueComparison = false;
}
score = currentScore;
}
return score;
}
}
Es posible que desee añadir una capa extra de precisión, para especificar, por cada campo, ya sea que la clasificación sea ascendente o descendente. Creo que una solución es reemplazar Field
objetos por los objetos de una clase que se podría llamar SortedField
, que contiene un objeto Field
, más otro campo que significa ascendiente o descendiente .
La segunda respuesta a esa pregunta es una buena ilustración. –
¿Esto ayuda: http://stackoverflow.com/questions/1206073/sorting-a-collection-of-objects – jjnguy
@sim, entonces ¿por qué no te tomas el tiempo para entender, en lugar de buscar el código? – Moonbeam