使用Java8Lambdas按不同元素对数组进行排序
如果我有一个使用Java8Lambdas按不同元素对数组进行排序,java,list,sorting,lambda,java-8,Java,List,Sorting,Lambda,Java 8,如果我有一个列表,其中每个字符串[]如下:{FirstName,LastName,Income,City}我将如何使用Java 8 lambdas按照特定值(如Income或first name)对列表进行排序?这里有几个示例。将下面前两个示例中的x替换为要用于排序的字段的索引 Collections.sort(personList, (p1, p2) -> p1[x].compareTo(p2[x])); 或 此外,我同意@Robin Topper的评论如果需要lambda(并且您想按
列表
,其中每个字符串[]
如下:{FirstName,LastName,Income,City}我将如何使用Java 8 lambdas按照特定值(如Income或first name)对列表进行排序?这里有几个示例。将下面前两个示例中的x替换为要用于排序的字段的索引
Collections.sort(personList, (p1, p2) -> p1[x].compareTo(p2[x]));
或
此外,我同意@Robin Topper的评论如果需要lambda(并且您想按名字排序),可以使用:
Collections.sort(personList, (p1, p2) -> p1.getFirstName().compareTo(p2.getFirstName()));
或
也可以考虑使用罗宾的注释和允许排序的数据结构的可比实现。
< P>如果你在数组中的顺序可以依赖< /强>,那么简单为: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)));
List List=Arrays.asList(新字符串[]{“eugene”,“test”,“300”,“LA”},
新字符串[]{“hunter”、“test2”、“25”、“CA”});
List sorted=List.stream()
.sorted(Comparator.comparingLong(s->Long.parseLong(s[2]))
.collect(Collectors.toList());
sorted.forEach->System.out.println(Arrays.toString);
但是从这些字段创建一个
对象的一般建议要好得多。为什么不把字符串[]
转换成一个对象,例如Person
,并让Person
类实现可比性?另外,如果收入是一个数字,把它放在一个字符串中会使它不可排序(它会按字母顺序排序).我建议的Person
类将使用getter和setter而不是公共字段;-)或Comparator.comparing(Person::getFirstName)
。同样,数组大小写的Comparator.comparing(a->a[x])
。在这两种情况下,Comparator.comparating
确保比较的双方使用相同的函数,从而避免复制和粘贴错误以及类似的错误。谢谢你,它对字符串非常有效,有什么方法可以将income元素解析为整数并按此排序吗?我实际上已经找到了答案。我使用了Collections.sort(relative,(p1,p2)->Integer.valueOf(p2[2]).compareTo(Integer.valueOf(p1[2])
您不需要创建用于排序的流,例如list.sort(Comparator.comparating(s->Long.parseLong(s[2]))
@RobinTopper是的,另一个答案显示了这一点。无论如何,thxList.of(…)
需要Java9。在Java8中,必须使用Arrays.asList(…)
。但是如果使用List.of
,则不能使用List.sort
,因此使用流是合理的。顺便说一下,使用Comparator.comparingLong(s->Long.parseLong(s[2])
,可能会有助于避免装箱开销。
personList.sort((p1, p2) -> p1.getFirstName().compareTo(p2.getFirstName()));
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)));