Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java8Lambdas按不同元素对数组进行排序_Java_List_Sorting_Lambda_Java 8 - Fatal编程技术网

使用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是的,另一个答案显示了这一点。无论如何,thx
List.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)));