使用Java 8 Lambda表达式按不同元素对数组列表进行排序

3
如果我有一个 List<String[]>,其中每个 String[] 如下所示:{FirstName, LastName, Income, City},我该如何使用Java 8 lambda根据某个值(例如收入或名字)对列表进行排序?

5
为什么不将 String[] 转换为一个对象,比如 Person,并让 Person 类实现 Comparable 接口? - Robin Topper
1
另外,如果收入是一个数字,将其放入字符串中将使其无法排序(它将按字母顺序排序)。 - Lluis Martinez
2个回答

5

以下是几个示例。将下面前两个示例中的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评论中的可比较实现和支持排序的数据结构。


2
我建议使用getter和setter而不是公共字段来定义“Person”类;-) - Robin Topper
8
或者 Comparator.comparing(Person::getFirstName) - shmosel
4
同样地,对于数组情况,可以使用Comparator.comparing(a -> a[x])。无论哪种情况,Comparator.comparing都确保比较的两个方面使用相同的函数,从而避免复制粘贴错误等类似问题。 - Holger
谢谢,它对字符串非常有效,有没有办法将收入元素解析为整数并按其排序? - Hunter Tipton
1
我终于搞定了。我使用了 Collections.sort(relative, (p1, p2) -> Integer.valueOf(p2[2]).compareTo(Integer.valueOf(p1[2]))); - Hunter Tipton

2
如果您可以依赖于此数组中的顺序,那么就像这样简单:
List<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,这样会更好。


2
你不需要为排序创建一个流,例如 list.sort(Comparator.comparing(s -> Long.parseLong(s[2]))) - Robin Topper
1
@RobinTopper 是的,我知道,另一个答案已经展示了。不管怎样,谢谢。 - Eugene
2
List.of(…) 需要 Java 9 版本以上。在 Java 8 中,你必须使用 Arrays.asList(…)。但是,如果你使用了 List.of,就不能使用 List.sort,所以使用流操作是合理的。 - Holger
1
顺便提一下,使用Comparator.comparingLong(s -> Long.parseLong(s[2]))可能会有益处,以避免装箱开销。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接