Jeśli wiesz z góry, które pola użyć do porównania, inne osoby udzieliły poprawnych odpowiedzi.
Co może Cię zainteresować, to sortowanie kolekcji w przypadku, gdy nie wiesz podczas kompilacji, jakie kryteria zastosować. Wyobraź masz program do czynienia z miast:
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());
}
}
gdzie można wymienić ciężko kodowane nazwy pól, których autorem nazwy pól wyprowadzona z prośbą użytkownika w programie.
W tym przykładzie City.CityMultiComparator<City>
jest statyczną zagnieżdżona klasa klasie City
realizacji 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;
}
}
Możesz dodać dodatkową warstwę precyzją, aby określić, na każde pole, czy sortowanie powinno być rosnąco czy potomkiem. Chyba rozwiązaniem jest zastąpienie Field
obiektów przez obiekty klasy można nazwać SortedField
, zawierający Field
obiektu, plus kolejne pole oznacza Ascendent lub potomek.
Druga odpowiedź na to pytanie jest dobrą ilustracją. –
Czy ta pomoc: http://stackoverflow.com/questions/1206073/sorting--collection-of-objects – jjnguy
@sim, To dlaczego nie poświęcasz czasu na zrozumienie, zamiast łowić kod? – Moonbeam