当前位置: 首页 > 知识库问答 >
问题:

使用流对列表进行排序。Java中的sorted()

乜承嗣
2023-03-14

我对从流中排序列表感兴趣。这是我正在使用的代码:

list.stream()
    .sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue()))
    .collect(Collectors.toList());

我是不是漏了什么?之后不会对列表进行排序。

它应该根据最低值的项目对列表进行排序。

for (int i = 0; i < list.size(); i++)
{
   System.out.println("list " + (i+1));
   print(list, i);
}

以及打印方法:

public static void print(List<List> list, int i)
{
    System.out.println(list.get(i).getItem().getValue());
}

共有3个答案

柯国安
2023-03-14

Java8提供了不同的实用程序api方法来帮助我们更好地对流进行排序。

如果您的列表是一个整数列表(或Double、Long、String等),那么您可以使用java提供的默认比较器对列表进行排序。

List<Integer> integerList = Arrays.asList(1, 4, 3, 4, 5);

动态创建比较器:

integerList.stream().sorted((i1, i2) -> i1.compareTo(i2)).forEach(System.out::println);

当没有参数传递给sorted()时,使用java 8提供的默认比较器:

integerList.stream().sorted().forEach(System.out::println); //Natural order

如果您想以相反的顺序排序相同的列表:

 integerList.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println); // Reverse Order

如果您的列表是用户定义对象的列表,则:

List<Person> personList = Arrays.asList(new Person(1000, "First", 25, 30000),
        new Person(2000, "Second", 30, 45000),
        new Person(3000, "Third", 35, 25000));

动态创建比较器:

personList.stream().sorted((p1, p2) -> ((Long)p1.getPersonId()).compareTo(p2.getPersonId()))
        .forEach(person -> System.out.println(person.getName()));

使用比较器。comparingLong()方法(我们还有comparingDouble()和ComparingIT()方法):

personList.stream().sorted(Comparator.comparingLong(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));

使用比较器。comparing()方法(基于提供的getter方法进行比较的通用方法):

personList.stream().sorted(Comparator.comparing(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));

我们也可以使用thenComparing()方法进行链接:

personList.stream().sorted(Comparator.comparing(Person::getPersonId).thenComparing(Person::getAge)).forEach(person -> System.out.println(person.getName())); //Sorting by person id and then by age.

人类

public class Person {
    private long personId;
    private String name;
    private int age;
    private double salary;

    public long getPersonId() {
        return personId;
    }

    public void setPersonId(long personId) {
        this.personId = personId;
    }

    public Person(long personId, String name, int age, double salary) {
        this.personId = personId;
        this.name = name;
        this.age = age;

        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}
雍兴修
2023-03-14

使用列表。改为排序

list.sort((o1, o2) -> o1.getItem().getValue().compareTo(o2.getItem().getValue()));

并使用Comparator.comparing使其更加简洁:

list.sort(Comparator.comparing(o -> o.getItem().getValue()));

之后,list本身将被排序。

您的问题是列表。流动sorted返回已排序的数据,但它不会按预期的方式进行排序。

燕飞文
2023-03-14

这与集合不同。sort()参数引用的排序位置。在这种情况下,您只需获得一个排序流,最终需要收集并分配给另一个变量:

List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
                                   compareTo(o2.getItem().getValue())).
                                   collect(Collectors.toList());

您刚刚错过了分配结果

 类似资料:
  • 我有一个这样的方法: 此方法需要以如下字符串形式返回3个最昂贵项目的产品ID:“item1,item2,item3”。我应该只能使用溪流,我被困在这里了。我应该能够按值对项目进行排序,然后获得产品ID,但我似乎无法使其正常工作。 编辑: 产品ID位于入口类中

  • 我有以下课程 我正在尝试按贡献者名称和角色名称对ResourceContributor列表进行排序。到目前为止,我得到的是: 我已经尝试使用then比较,但还不知道如何使用它。

  • 问题内容: 我有兴趣对流中的列表进行排序。这是我正在使用的代码: 我想念什么吗?列表未排序。 它应该根据具有最低值的项目对列表进行排序。 以及打印方法: 问题答案: 这与对参数引用进行排序的地方不同。在这种情况下,您将得到一个排序后的流,最终需要将其收集并分配给另一个变量: 您只是错过了分配结果

  • 我有以下课程 我正在尝试按贡献者名称和角色名称对ResourceContributor列表进行排序。到目前为止,我得到的是: 我试过使用thenComparing,但还不知道如何使用它。

  • 问题内容: 我的清单包含大小等的集合。我尝试这样做,但似乎不起作用。 我想要的最终结果是。 我可以尝试添加在所有的元素和那种出来再做出新的的。但是,有某种班轮吗? 更新: 这可行,但是可以简化吗? 问题答案: @Eugene的回答很甜蜜,因为番石榴很甜。但是,如果您碰巧在类路径中没有番石榴,这是另一种方式: 首先,我将所有集合映射到一个流中,然后对所有元素进行排序,最后,将整个排序后的流收集到集合

  • 问题内容: 我在Python中有两个列表 我想对第一个列表进行排序,并使用结果对第二个列表进行排序。 换句话说,结果应为: 我知道如何分别对每个列表进行排序,但是如何使用对另一个列表进行排序所产生的索引排列来对一个列表进行排列呢? 问题答案: 施瓦兹变换