我一直在尝试寻找一个如何使用java流作为压缩器的示例。我仍然不知道如何做到这一点,也没有找到其他人做到这一点。因此,我想对流中出现的某事进行计数,只要它们不间断地排成一行即可。一个简单的例子就是这样:
String str = "...---...";
String compressed = func(str);
compressed.equals("3.3-3.");
很容易将字符串放入整数流中并计算它们的出现次数。但是以不间断的顺序计数出现的次数,我不知道该怎么办。是否有使用 .reduce 做到这一点的好方法?
答案 0 :(得分:1)
我认为Stream
不适合用于游程长度编码。流和状态通常不能很好地结合在一起。要计算已经计数的字符数,必然会涉及状态。一种实现方法是使用reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)
并将匿名类(是,匿名类)传递给它,在这些匿名类中,您可以保留一个变量来记录一个字符的数量。然后,您可以使用StringBuilder
来附加编码后的字符串。这不是一个很好的解决方案。
我有一点创意,并且做到了:
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);
我确实在使用流,但是我作弊了一点,并使用了正则表达式:)。