使用Java流进行数据压缩

时间:2018-11-24 14:59:38

标签: java stream java-stream run-length-encoding

我一直在尝试寻找一个如何使用java流作为压缩器的示例。我仍然不知道如何做到这一点,也没有找到其他人做到这一点。因此,我想对流中出现的某事进行计数,只要它们不间断地排成一行即可。一个简单的例子就是这样:

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

很容易将字符串放入整数流中并计算它们的出现次数。但是以不间断的顺序计数出现的次数,我不知道该怎么办。是否有使用 .reduce 做到这一点的好方法?

1 个答案:

答案 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);

我确实在使用流,但是我作弊了一点,并使用了正则表达式:)。