这是您需要的方法。定义比较器后,只需从列表 1 开始对 sublist 进行排序,跳过标题。由于它是原始列表的视图,它仍然对所需项目进行排序。
首先在要排序的字段上制作字段映射。如果你愿意,你可以不区分大小写。对于这个例子,大小写很重要。
static Map<String, Integer> sortingFields = new HashMap<>();
static {
List<String> columns = List.of("Name", "Age", "Salary");
for (int i = 0; i < columns.size(); i++) {
sortingFields.put(columns.get(i), i);
}
}
创建列表列表。
List<List<String>> data = new ArrayList<>();
data.add(new ArrayList<>(List.of("Name" ,"Age", "Salary")));
data.add(new ArrayList<>(List.of("Lim", "20", "4000")));
data.add(new ArrayList<>(List.of("Tan", "20", "3000")));
data.add(new ArrayList<>(List.of("Mah", "19", "2500")));
data.add(new ArrayList<>(List.of("Roger", "10", "3500")));
现在调用排序和打印
sort("Age", data);
data.forEach(System.out::println);
打印
[Name, Age, Salary]
[Roger, 10, 3500]
[Mah, 19, 2500]
[Lim, 20, 4000]
[Tan, 20, 3000]
这是排序方法。
public static void sort(String Column, List<List<String>> data) {
// use the column string to select the column number to sort.
Comparator<List<String>> comp =
(a, b) -> a.get(sortingFields.get(column))
.compareTo(b.get(sortingFields.get(column)));
data.subList(1,data.size()).sort(comp);
}
以下是我建议您组织数据并进行排序的方法。
首先创建一个如图所示的类。然后使用数据用类的实例填充列表。然后只需指定要排序的 getter。您可以根据需要添加任意数量的其他字段及其 getter。
原因是它允许混合类型存储在同一个对象中并且仍然可以排序。如果您按String number 排序,它将排序lexcally 而不是numerically。除非您转换为整数,否则这将是一个问题(要查看此内容,请将4000 更改为400 并按上面的薪水排序)。但是,如果要对名称进行排序,则需要一个不同的比较器,因为将非 int 转换为 int 会引发异常。这一切都可以在一定程度上得到缓解,但不如创建一个类那么简单。
只需将方法引用更改为所需的getter,您就可以在任何字段上对List 进行排序。如果没有 getter,并且该字段是公共的(不推荐),您可以使用 lambda。
public class SortingByColumn {
public static void main(String[] args) {
List<Person> data = new ArrayList<>();
data.add(new Person("Lim", 20, 2000));
data.add(new Person("Tan", 20, 3000));
data.add(new Person("Mah", 19, 2500));
data.add(new Person("Roger", 10, 4000));
List<Person> sorted = data.stream()
.sorted(Comparator.comparing(Person::getAge))
.collect(Collectors.toList());
System.out.printf("%10s %10s %10s%n", "Name","Age","Salary");
sorted.forEach(System.out::println);
}
static class Person {
private String name;
private int age;
private int salary;
public Person(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getSalary() {
return salary;
}
@Override
public String toString() {
return String.format("%10s %10s %10s", name, age,
salary);
}
}
}
打印
Name Age Salary
Roger 10 4000
Mah 19 2500
Lim 20 2000
Tan 20 3000