【问题标题】: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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2011-11-29
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多