java中按字段对自定义对象类进行多重排序 package com.learnjava; 导入java.io.IOException; 导入java.nio.file.Files; 导入java.nio.file.path; 导入java.util.array; 导入java.util.Collections; 导入java.util.Comparator; 导入java.util.List; 导入java.util.Scanner; 导入java.util.stream.stream; 公共类EmployeeSortByGroup{ 公共静态无效排序EmployeeByGRP(列出人员,字符串[]排序){ 对于(int i=0;i
使用 您现在可以轻松地增强解析以支持降序排序,例如,通过在字段名后添加一个java中按字段对自定义对象类进行多重排序 package com.learnjava; 导入java.io.IOException; 导入java.nio.file.Files; 导入java.nio.file.path; 导入java.util.array; 导入java.util.Collections; 导入java.util.Comparator; 导入java.util.List; 导入java.util.Scanner; 导入java.util.stream.stream; 公共类EmployeeSortByGroup{ 公共静态无效排序EmployeeByGRP(列出人员,字符串[]排序){ 对于(int i=0;i,java,sorting,chained,Java,Sorting,Chained,使用 您现在可以轻松地增强解析以支持降序排序,例如,通过在字段名后添加一个-减号,这样“firstname-;age”将按firstname降序排序,然后按age升序排序 // You will now use it like this. No need for using a List Arrays.sort(persons, parsePersonSortBy(sortByString)); publicstaticcomparatorparsesortby(stringsortby,fu
-
减号,这样“firstname-;age”
将按firstname
降序排序,然后按age
升序排序
// You will now use it like this. No need for using a List
Arrays.sort(persons, parsePersonSortBy(sortByString));
publicstaticcomparatorparsesortby(stringsortby,functionfieldcomparatormapper){
比较器sortComparator=null;
for(字符串字段:sortBy.split(“;”)){
布尔降序=字段.endsWith(“-”);
比较器c=fieldComparatorMapper.apply(降序?field.substring(0,field.length()-1):字段);
如果(降序)
c=c.反向();
sortComparator=(sortComparator==null?c:sortComparator.ThenComparating(c));
}
返回排序比较程序;
}
生成一个Map@SanjayKumarNayak不要在评论中添加额外信息。编辑问题(问题下方的灰色链接)以澄清问题。
public static Comparator<Person> parseSortBy(String sortBy) {
Comparator<Person> sortComparator = null;
for (String field : sortBy.split(";")) {
Comparator<Person> c;
switch (field) {
case "firstname":
c = Comparator.comparing(Person::getFirstName);
break;
case "lastname":
c = Comparator.comparing(Person::getLastName);
break;
case "age":
c = Comparator.comparingInt(Person::getAge);
break;
case "country":
c = Comparator.comparing(Person::getCountry);
break;
default:
throw new IllegalArgumentException("Unknown sort spec: " + field);
}
sortComparator = (sortComparator == null ? c : sortComparator.thenComparing(c));
}
return sortComparator;
}
public static Comparator<Person> parsePersonSortBy(String sortBy) {
return parseSortBy(sortBy, field -> {
switch (field) {
case "firstname": return Comparator.comparing(Person::getFirstName);
case "lastname": return Comparator.comparing(Person::getLastName);
case "age": return Comparator.comparingInt(Person::getAge);
case "country": return Comparator.comparing(Person::getCountry);
default: throw new IllegalArgumentException("Unknown sort spec: " + field);
}
});
}
// The following method should be in a separate helper class for reusability
public static <E> Comparator<E> parseSortBy(String sortBy, Function<String, Comparator<E>> fieldComparatorMapper) {
Comparator<E> sortComparator = null;
for (String field : sortBy.split(";")) {
Comparator<E> c = fieldComparatorMapper.apply(field);
sortComparator = (sortComparator == null ? c : sortComparator.thenComparing(c));
}
return sortComparator;
}
// You will now use it like this. No need for using a List
Arrays.sort(persons, parsePersonSortBy(sortByString));
public static <E> Comparator<E> parseSortBy(String sortBy, Function<String, Comparator<E>> fieldComparatorMapper) {
Comparator<E> sortComparator = null;
for (String field : sortBy.split(";")) {
boolean descending = field.endsWith("-");
Comparator<E> c = fieldComparatorMapper.apply(descending ? field.substring(0, field.length() - 1) : field);
if (descending)
c = c.reversed();
sortComparator = (sortComparator == null ? c : sortComparator.thenComparing(c));
}
return sortComparator;
}