Сортировка списка <Integer>с использованием лямбда-выражения - PullRequest
0 голосов
/ 07 ноября 2018

Как мне отсортировать это с помощью лямбда-выражения? Я полагаю, чтобы отсортировать первые 7 чисел и исключить последний номер. Я видел, что IntStream.concat можно использовать, но мне нужно использовать лямбда-выражение для сортировки.

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

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете использовать лямбду в качестве второго параметра для Collections.sort(), предоставляя подсписок в качестве первого параметра:

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

Это будет эквивалентно Collections.sort(lucky.subList(0, lucky.size()-1)), поэтому вам не нужна эта лямбдавыражение здесь.

Другим способом (не эффективным) будет использование 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 различны.Это можно сделать на основе индекса, хотя это ухудшит производительность этой сортировки.

0 голосов
/ 07 ноября 2018

Требование «использовать лямбда-выражение» довольно странно. Я могу выполнить это требование, просто заменив вызов .limit на

.limit(((IntSupplier)() -> 8).getAsInt())

Посмотрите! Я использовал лямбда там! () -> 8. А затем вы можете перейти к решению проблемы с concat, как вы сказали.

Очевидно, это не то, что вы имели в виду.

Если вы хотите поместить лямбду в метод sort, чтобы отсортировать первые 7 целых чисел, а затем всегда оставлять восьмое в конце, вы можете сделать что-то вроде этого:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...