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
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());.
Комментариев нет:
Отправить комментарий