我对这个问题提出了两种不同的方法。如果您正在做家庭作业或类似的事情并且您不想使事情复杂化,您可以选择第一种方法。不建议对类的字段名称进行硬编码,但因为您正在寻找一种通过名称获取字段值的方法:
解决方案1:
“不推荐用于生产代码”
比较器:
public static Integer compareTwoStudents(Student student1, Student student2, String field) throws NoSuchFieldException {
switch (field) {
case "id":
return student1.getId().compareTo(student2.getId());
case "name":
return student1.getName().compareTo(student2.getName());
case "age":
return student1.getAge().compareTo(student2.getAge());
default:
throw new NoSuchFieldException();
}
}
排序算法:
public static void selectionSort(Student[] list, String key) {
for (int i = 0; i < list.length - 1; i++) {
int minElementIndex = i;
for (int j = i + 1; j < list.length; j++) {
if (compareTwoStudents(list[minElementIndex], list[j], key) > 0) {
minElementIndex = j;
}
}
if (minElementIndex != i) {
Student temp = list[i];
list[i] = list[minElementIndex];
list[minElementIndex] = temp;
}
}
}
“解决方案 2”
使用泛型,您可以定义一个泛型 getter 方法和一个泛型比较器,如下所示:
通用吸气剂:
private static <T> Field getField(Class<T> clazz, String fieldName) {
try {
return clazz.getDeclaredField(fieldName);
} catch (java.lang.NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
通用比较器:
public static <T> Comparator<T> getGenericComparatorLambda(Class<T> clazz,
String fieldName) {
final Field field = getField(clazz, fieldName);
field.setAccessible(true);
Comparator<T> orderByComparator = (f1, f2) -> {
Comparable compA, compB;
try {
compA = (Comparable) field.get(f1);
compB = (Comparable) field.get(f2);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
return Objects.compare(compA, compB, Comparator.naturalOrder());
};
return orderByComparator;
}
排序算法:
public static void selectionSort(Student[] list, String key) {
for (int i = 0; i < list.length - 1; i++) {
int minElementIndex = i;
for (int j = i + 1; j < list.length; j++) {
if (getGenericComparatorLambda(Student.class, key).compare(list[minElementIndex], list[j]) > 0) {
minElementIndex = j;
}
}
if (minElementIndex != i) {
Student temp = list[i];
list[i] = list[minElementIndex];
list[minElementIndex] = temp;
}
}
}