【问题标题】:Using java-streams for data compression使用 java-streams 进行数据压缩
【发布时间】:2018-11-24 14:59:37
【问题描述】:
我一直在尝试找到一个如何使用 java-streams 作为压缩器的示例。我仍然没有弄清楚如何做到这一点,我也没有找到其他人这样做。因此,我想做的是计算流中某些事物的出现次数,只要它们在不间断的行中即可。一个简单的例子是这样的:
String str = "...---...";
String compressed = func(str);
compressed.equals("3.3-3.");
将字符串放入整数流并计算它们出现的次数很简单。但是以不间断的顺序计算出现次数我不知道该怎么做。有没有使用 .reduce 的好方法来实现这一点?
【问题讨论】:
标签:
java
stream
java-stream
run-length-encoding
【解决方案1】:
我认为Streams 不适合用于行程编码。流和状态通常不能很好地结合在一起。为了计算你已经数过多少个字符,不可避免地会涉及到状态。一种方法是使用reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) 并将匿名类(是的,匿名类)传递给它,并且在这些匿名类中,您可以保留一个变量来记录有多少个字符。然后,您可以使用 StringBuilders 附加编码字符串。这不是一个优雅的解决方案。
我有点创意,做了这个:
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);
我确实在使用流,但我作弊了一点并且使用了正则表达式:)。