使用Lambda表达式对List <integer>进行排序

时间:2018-11-07 18:21:35

标签: java sorting lambda

如何使用Lambda表达式对此进行排序? 我想对前7个数字进行排序,并排除最后一个数字。我看到可以使用IntStream.concat,但是我需要使用Lambda表达式进行排序。

     Random random = new Random();
        List <Integer> lucky = random.ints (1, 64)
                                     .distinct()
                                     .limit(8)
                                     .boxed()
                                     .sorted()
                                     .collect(Collectors.toList());

2 个答案:

答案 0 :(得分:3)

“使用lambda表达式”的要求很奇怪。我只需将.limit调用替换为

即可满足此要求
.limit(((IntSupplier)() -> 8).getAsInt())

看!我在那里用过lambda! () -> 8。然后,您可以按照您所说的继续concat来解决问题。

显然,这不是您的意思。

如果要将lambda放入sort方法中以对前7个整数进行排序,然后始终将第8个整数保留在最后,则可以执行以下操作:

Random random = new Random();
List<Integer> unsorted = random.ints(1, 64)
        .distinct()
        .limit(8)
        .boxed()
        .collect(Collectors.toList());

// here you need to get the last element that you don't want to sort
int last = unsorted.get(unsorted.size() - 1);
// here is the lambda
List<Integer> sorted = unsorted.stream().sorted((x, y) -> {
    if (Integer.compare(x, y) == 0) {
        return 0;
    }
    // if any one of the arguments is the last one...
    if (last == x) {
        return 1;
    }
    if (last == y) {
        return -1;
    }
    return Integer.compare(x, y);
}).collect(Collectors.toList());
// you can also use "List.sort" with the same lambda

请注意,我个人认为此sorted方法调用非常不可读。乍一看,我看不到您正在尝试对除最后一个以外的所有内容进行排序。就可读性而言,使用concat会更好。

答案 1 :(得分:2)

您可以将lambda用作Collections.sort()的第二个参数,并提供子列表作为第一个参数:

Collections.sort(lucky.subList(0, lucky.size()-1), 
                 (i1, i2) -> i1.compareTo(i2));

这等效于Collections.sort(lucky.subList(0, lucky.size()-1)),因此您在这里实际上不需要此lambda表达式。

另一种方法(不是有效的方法)将使用Stream.concat()

List<Integer> sorted = Stream.concat(
        lucky.stream()
             .filter(elem -> !elem.equals(lucky.get(lucky.size() - 1))).sorted(),
        Stream.of(lucky.get(lucky.size() - 1)))
                       .collect(Collectors.toList());

请注意,由于lucky列表中的项目是不同的,因此我将根据值(而不是索引)过滤第一个流中的项目。可以根据索引来完成此操作,尽管这会使排序的性能更差。