【问题标题】:Run Length Encoding for Array数组的运行长度编码
【发布时间】:2020-11-10 13:05:02
【问题描述】:

我一直在尝试对字符串数组进行游程编码压缩,但我没有得到预期的结果):

这是我的代码

static void encode(final String input) {
        String[] values = input.split(" ");

       StringBuilder sb = new StringBuilder();

       String lastElement = "";
       long count = 0;
       for(String e : values) {
           if(e.equals(lastElement)) {
               count++;
               sb.append(" " + count + " ");
           } else {
               sb.append(e);
               lastElement = e;
               count = 0;
           }
       }

       System.out.println(sb.toString());
   }

我的意见:encode("Smile Smile Smile JO JO");

我得到的输入:Smile 1 2 JO 1

但没想到会是这样,我想得到的结果是:

Smile 2 JO 1

谁能帮帮我?

【问题讨论】:

  • 那不是run-length encoding。游程编码采用像“aaaabbccc”这样的单个值的重复,并使其类似于“4a2b3c”。也不是LZ77。在弄清楚如何对其进行编码之前,您需要考虑如何正确解码您的格式。你的格式没有多大意义。

标签: java compression


【解决方案1】:

好吧,如果values[5]values[4] 的值相同,if(e.equals(lastElement)) 就会触发。这将增加计数然后将其打印出来。哪个是错的,除非values[6]不一样,否则就是对的。

想一想:当你在第二个Smile 时,你还不知道该做什么。你被耽误了一个:你看到第一个“JO”,然后你就知道了。

要么编写看起来“先行一步”的代码,要么编写记住要为上一个条目做什么并在您知道它相关时执行的代码。它会比你目前的复杂一点。

【讨论】:

  • 我该怎么做?
  • 什么变量,以及一些if 块,可能。
【解决方案2】:

您正在打印每场比赛的计数。 “Smile”匹配了两次,因此它打印 1 和 2。尝试在 else 和 String 循环之后添加此条件。

if (count>0)
{
    sb.append(" " + count + " ");
}

【讨论】:

  • 您是否打印了一个字符串,然后它出现的计数不止一次?如果是,那么它应该可以工作。您可能还需要从第一个 if 条件中删除将 count 添加到 stringbuffer 的语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多