Nếu bạn biết trước lĩnh vực nào cần sử dụng để so sánh, thì người khác đưa ra câu trả lời đúng.
Điều bạn có thể quan tâm là sắp xếp bộ sưu tập của mình trong trường hợp bạn không biết thời gian biên dịch áp dụng tiêu chí nào. Hãy tưởng tượng bạn có một chương trình làm việc với các thành phố:
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());
}
}
nơi bạn có thể thay thế tên trường mã hóa cứng bởi tên trường rút ra từ một yêu cầu người sử dụng trong chương trình của bạn.
Trong ví dụ này, City.CityMultiComparator<City>
là một lớp lồng nhau tĩnh của lớp City
thực hiện 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;
}
}
Bạn có thể muốn thêm thêm một lớp chính xác, xác định, đối với mỗi lĩnh vực, cho dù phân loại nên được tăng dần hoặc hậu duệ. Tôi đoán một giải pháp là thay thế Field
đối tượng bởi các đối tượng của một lớp học mà bạn có thể gọi SortedField
, chứa một đối tượng Field
, cộng với lĩnh vực khác có nghĩa lên cao hoặc hậu duệ.
Nguồn
2013-02-16 19:18:39
Câu trả lời thứ hai cho câu hỏi đó là minh họa tốt. –
Điều này có hữu ích không: http://stackoverflow.com/questions/1206073/sorting-a-collection-of-objects – jjnguy
@sim, Vậy tại sao bạn không dành thời gian để hiểu, thay vì câu cá cho mã? – Moonbeam