Найти самую маленькую и самую большую подстроку из строки с помощью потоковой операции - PullRequest
0 голосов
/ 20 октября 2018

У меня есть строка s и целое число k (длина подстроки) , я пытаюсь написать функцию, чтобы она нашла лексикографически наименьшую и наибольшую подстрокидлиной k .И он возвращает строку, в которой самая маленькая и самая большая подстрока объединяются с символом новой строки.

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

public static String getSmallestAndLargest(String s, int k) {
    String smallest = "";
    String largest = "";

    smallest = IntStream.range(0, s.length() - k + 1).mapToObj((value) -> s.substring(value, value + k))
            .collect(Collectors.minBy(String.CASE_INSENSITIVE_ORDER)).get();

    largest = IntStream.range(0, s.length() - k + 1).mapToObj((value) -> s.substring(value, value + k))
            .collect(Collectors.maxBy(String.CASE_INSENSITIVE_ORDER)).get();

    return smallest + "\n" + largest;
}

Я ценю любые предложения, так как сейчас изучаю лямбду и поток.

Итак, как мне решить эту простую задачу?проблема элегантно ?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы можете использовать SummaryStatistics класс этот ответ

Тогда решение становится:

SummaryStatistics<String> ss = IntStream.rangeClosed(0, s.length() - k)
    .mapToObj(value -> s.substring(value, value + k))
    .collect(SummaryStatistics.statistics(String.CASE_INSENSITIVE_ORDER));

String smallest = ss.getMin();
String largest  = ss.getMax();
0 голосов
/ 20 октября 2018

Я бы просто пошел в старую школу и собрал отсортированный поток в список и получил бы первый и последний элемент:

List<String> list = IntStream.range(0, s.length() - k + 1)
    .mapToObj((value) -> s.substring(value, value + k))
    .sorted(String.CASE_INSENSITIVE_ORDER)
    .collect(Collectors.toList());

smallest = list.get(0);
largest = list.get(list.size() - 1);
...