Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как отобразить с помощью stream строку: aaabccccCCaB в следующем виде: 3ab4c2CaB?

P.S. У меня не получается отсортировать по нормальному, чтобы сохранить порядок как при вводе (aaabccccCCaB), и мой стрим считает все одинаковые эл-ты, т.е. выдает след результат: 4aBb2C4c вместо 3ab4c2CaB.
public class Main { public static void main(String[] args) { Arrays.stream((new Scanner(System.in)).nextLine().split("")) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .forEach((el, count) -> { if (count>1) System.out.print(count + el); if (count<=1) System.out.print(el); }); } }


Ответ

Можно, например, так:
String text = "aaabccccCCaB";
Arrays.stream(text.split("")) .collect(Collector.of(ArrayList::new, (o, s) -> { if (o.size() != 0 && o.get(o.size()-1).charAt(0) == s.charAt(0)) { StringBuilder sb = o.get(o.size() - 1); sb.append(s); } else { o.add(new StringBuilder(s)); } }, (o, o2) -> null)) .forEach(sb -> System.out.print((sb.length()>1 ? sb.length() : "") + sb.substring(0,1)));
PS Не сработает на паралельных стримах из-за:
(o, o2) -> null)
Тоже с вынесением BiConsumer:
BiConsumer, String> biConsumer = (list, s) -> { if (list.size() != 0 && (list.get(list.size() - 1)).charAt(0) == s.charAt(0)) { StringBuilder sb = list.get(list.size() - 1); sb.append(s); } else { list.add(new StringBuilder(s)); } };
System.out.println(Arrays.stream(text.split("")) .collect(Collector.of(ArrayList::new, biConsumer, (o, o2) -> null)) .stream().map(sb -> (sb.length()>1 ? sb.length() : "") + sb.substring(0,1)) .collect(Collectors.joining()));
Еще один вариант:
String text = "aaabccccCCaB"; StringBuilder result = new StringBuilder(); IntStream.range(0, text.length()+1) .filter(value -> value==0 || value == text.length() || text.charAt(value) != text.charAt(value-1)) //или так .reduce((l, r) -> { result.append(r-l > 1 ? r-l : "") .append(text.substring(l, l+1)); return r;}) //или сразу выводить на консоль без StringBuilder //.reduce((l, r) -> { // System.out.print(r-l > 1 ? r-l : ""); // System.out.print(text.substring(l, l+1)); // return r;}) .isPresent();
System.out.println(result.toString());.

Комментариев нет:

Отправить комментарий