排序流降序数

时间:2020-06-24 00:18:40

标签: java java-stream

我有一个看起来像这样的列表:[3 : [Reasonable product ], 5 : [Great ]] 我想按:前的数字对列表进行排序(使用流)。 该列表必须如下所示: [5 : [Great ], 3 : [Reasonable product ]] 我的代码如下所示: return ratingsForProduct.stream().sorted().collect(Collectors.toList()); 我不知道如何使用lambda函数或我必须将哪些参数作为sorted()的参数。

4 个答案:

答案 0 :(得分:3)

您可以通过从每个字符串中提取整数来传递自定义Comparator以对降序进行排序

List<String> sortedList = list.stream()
            .sorted(Comparator.<String>comparingInt(s->Integer.parseInt(s.split(":")[0].trim())).reversed())
            .collect(Collectors.toList());

或者您也可以使用Collections.sort

Collections.sort(list,Comparator.<String>comparingInt(s->Integer.parseInt(s.split(":")[0].trim())).reversed());

答案 1 :(得分:1)

如果可以确定列表项目的格式,则可以编写自己的比较器:

Collections.sort(ratingsForProduct, (a, b) -> {
    return Integer.parseInt(b.substring(0, b.indexOf(':'))) -
           Integer.parseInt(a.substring(0, a.indexOf(':')));
});

我们使用substring(0, indexOf(':'))而不是charAt(0)处理大于10的值。如果要按升序排序,则可以将比较器更改为从a减去b(而不是从b减去a当前)。

答案 2 :(得分:1)

List<String> list = new ArrayList<>(
        List.of("3 : [Reasonable product ]", "5 : [Great ]"));

比较器只是在字符串的开头解析数字,直到遇到空格为止。它适用于整数范围内的任何大小数字。您可以使用流或Collections.sort();

Comparator<String> comp = Comparator.comparing(
        a -> Integer.valueOf(a.substring(0,a.indexOf(" "))),
        Comparator.reverseOrder());

list = list.stream().sorted(comp)
        .collect(Collectors.toList());

System.out.println(list);

打印

[5 : [Great ], 3 : [Reasonable product ]]

答案 3 :(得分:1)

我认为每次比较字符串时,将字符串转换为整数效率不高。

尝试一下。

List<String> result = list.stream()
    .map(string -> new Object() {
        int key = Integer.valueOf(string.substring(0, string.indexOf(":")).trim());
        String value = string;
    })
    .sorted(Comparator.comparing(obj -> obj.key, Comparator.reverseOrder()))
    .map(obj -> obj.value)
    .collect(Collectors.toList());

List<String> result = list.stream()
    .map(string -> Map.entry(Integer.valueOf(string.substring(0, string.indexOf(":")).trim()), string))
    .sorted(Comparator.comparing(Entry::getKey, Comparator.reverseOrder()))
    .map(Entry::getValue)
    .collect(Collectors.toList());
相关问题