我正在尝试使用Java8中引入的Comparator.comparing()构建自定义比较逻辑。
的要求是:如果在Person类中引入了一个新字段,那么代码应该可以工作。它应该把新的领域纳入比较逻辑。
这意味着比较逻辑应该是这样的: id -> name --> newfield1 --> newfield2
见下面的伪代码:
package test;
import java.lang.reflect.Field;
import java.util.Comparator;
public class Test6 {
public static void main (String args []) {
Field[] declaredFields = Person.class.getDeclaredFields();
Comparator<Person> comparator = Comparator.comparing((Person x)-> x.getId());
for (int i=1; i<declaredFields.length ; i++) {
comparator = comparator.thenComparing(field[i]); // what code should I place over here, to make it work for field obtained above.
}
List<Person> persons = new ArrayList<>();
persons.stream().sorted(comparator).collect(Collectors.toList());
}
}
class Person{
int id ;
String name;
// if we add new field , then this field should also be included in comparison logic
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}发布于 2021-02-08 18:13:55
要做您想要做的事情是有问题的,因为您需要使用反射将一个函数(它描述一个返回类型)传递给比较器。因为我认为您无论如何都需要修改类,以包含新字段以及它们的getter和构造函数。通过这样做,您可以指定在比较中应用getter的顺序。
class Person implements Comparable<Person> {
int id;
String name;
String foo;
private Comparator<Person> comparing = Comparator.comparing(Person::getId);
{
comparing = comparing.thenComparing(Person::getName);
comparing = comparing.thenComparing(Person::getFoo);
// as new fields/getters are added, also append (or insert) the
// comparator.
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Person p) {
return comparing.compare(this, p);
}
public String getFoo() {
return foo;
}
}然后你就可以这样称呼它。
List<Person> sortedPersons = persons.stream().sorted()
.collect(Collectors.toList());或者如果他们已经在List中
persons.sort(null); // null == natural ordering.https://stackoverflow.com/questions/66103523
复制相似问题