Использование java-потоков для сжатия данных - PullRequest
0 голосов
/ 24 ноября 2018

Я пытался найти пример использования java-потоков в качестве компрессора.Я до сих пор не понял, как это сделать, и я не нашел никого, кто сделал это.Итак, что я хотел бы сделать, это подсчитать вхождения, что-то в потоке, пока они находятся в непрерывной строке.Простым примером будет что-то вроде этого:

String str = "...---...";
String compressed = func(str);
compressed.equals("3.3-3.");

Просто получить строку в поток целых чисел и сосчитать их вхождения.Но посчитать вхождения в непрерывной последовательности я не могу понять, как это сделать.Есть ли хороший способ использования .reduce , чтобы это произошло?

1 Ответ

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

Я не думаю, что Stream s - это подходящая вещь для кодирования длин серий.Потоки и состояния просто не очень хорошо сочетаются друг с другом.Для подсчета количества уже подсчитанных вами символов неизбежно потребуется состояние.Один из способов сделать это - использовать reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) и передавать ему анонимные классы (да, анонимные классы), а в этих анонимных классах вы можете хранить переменную, которая записывает, сколько символов в нем есть.Затем вы можете использовать StringBuilder s для добавления закодированных строк.Это не элегантное решение.

Я немного креативен и сделал это:

String str = "aaaajjjfjjeeee";
String result = Pattern.compile("(?<=(.))(?!\\1)")
                    .splitAsStream(str)
                    .map(x -> 
                        Character.toString(x.charAt(0)) + 
                        Integer.toString(x.length()))
                     .collect(Collectors.joining());
System.out.println(result);

Я действительно использую потоки, но немного обманул и использовал регулярное выражение:).

...