如果我有一个
List<String[]>
,其中每个 String[]
如下所示:{FirstName, LastName, Income, City},我该如何使用Java 8 lambda根据某个值(例如收入或名字)对列表进行排序?以下是几个示例。将下面前两个示例中的x替换为您想用于排序的字段的索引。
Collections.sort(personList, (p1, p2) -> p1[x].compareTo(p2[x]));
或者
personList.sort((p1, p2) -> p1[x].compareTo(p2[x]);
此外,我同意@Robin Topper的评论。如果需要使用lambda表达式(并且您想按名字排序),您可以使用以下代码:
Collections.sort(personList, (p1, p2) -> p1.getFirstName().compareTo(p2.getFirstName()));
或者
personList.sort((p1, p2) -> p1.getFirstName().compareTo(p2.getFirstName()));
同时考虑使用Robin评论中的可比较实现和支持排序的数据结构。
Comparator.comparing(Person::getFirstName)
。 - shmoselComparator.comparing(a -> a[x])
。无论哪种情况,Comparator.comparing
都确保比较的两个方面使用相同的函数,从而避免复制粘贴错误等类似问题。 - HolgerCollections.sort(relative, (p1, p2) -> Integer.valueOf(p2[2]).compareTo(Integer.valueOf(p1[2])));
。 - Hunter TiptonList<String[]> list = Arrays.asList(new String[] { "eugene", "test", "300", "LA" },
new String[] { "hunter", "test2", "25", "CA" });
List<String[]> sorted = list.stream()
.sorted(Comparator.comparingLong(s -> Long.parseLong(s[2])))
.collect(Collectors.toList());
sorted.forEach(s -> System.out.println(Arrays.toString(s)));
但是通常建议从这些字段创建一个Object
,这样会更好。
list.sort(Comparator.comparing(s -> Long.parseLong(s[2])))
。 - Robin TopperList.of(…)
需要 Java 9 版本以上。在 Java 8 中,你必须使用 Arrays.asList(…)
。但是,如果你使用了 List.of
,就不能使用 List.sort
,所以使用流操作是合理的。 - HolgerComparator.comparingLong(s -> Long.parseLong(s[2]))
可能会有益处,以避免装箱开销。 - Holger
String[]
转换为一个对象,比如Person
,并让Person
类实现 Comparable 接口? - Robin Topper