java - Java 中的运行长度编码 - 意外输出

标签 java loops compression

我被分配用 Java 为我的类(class)完成一项任务。它基本上是一个游程长度编码程序,它遍历输入的字符串并将其压缩,(例如:aaaabbb 变成 a4b3)

流程:

我的代码遍历输入字符串中的每个字符,并检查原始字符是否等于下一个字符。如果为真,它会增加计数并最终连接计数和原始字母。如果原始字母不等于下一个字符 - 则从 1 开始计数并启动新的 for 循环。如果 for 循环中的字符等于位置 i 中的字符,则它会增加计数,直到下一个字母不等于前一个字母。重复此操作,直到读取输入中的所有字符。

我尝试编写以下代码:

import java.util.Scanner;

class RLE {
    RLE() {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        int count = 0;

        for (char c : input.toCharArray()) {
            if (input.charAt(0) == c) {
                count++;
                input = input.charAt(0) + Integer.toString(count);
            }

            else {

                count = 1;

                for (int i = 0; i < input.length(); i++) {

                    if (c == input.charAt(i)) {
                        count++;
                    }
                }

                input = input.concat(c + Integer.toString(count));
            }
        }

        System.out.println(input);

    }
}

示例

这是我的以下输入:aaabbbccc

实际输出:a3b1b2b3c1c2c3

预期输出:a3b3c3

有人可以解释一下我做错了什么吗?我尝试用不同的方法重做代码,但没有成功。我最好的猜测是原始输入字符串被扩展,因此扩展了原始 for 循环,但这也可能是错误的。非常感谢!

最佳答案

首先,您不应该使用变量输入进行输入和输出。它使得阅读变得困难并且可能会产生错误。您应该检查是否有空输入。之后,您只需要一个循环来选择一个角色,并将其与以下角色进行比较。如果相同,则增加一个计数器,如果不与计数一起添加到输出中,则重置字符和计数器并继续。最后你必须检查是否还剩下一些休息时间。

import java.util.Scanner;

class RLE {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String input = sc.next();
    int count = 0;

    String output = "";
    if (!input.isEmpty()) {
        char actual = input.charAt(0);
        for (char c : input.toCharArray()) {
            if (actual == c) {
                count++;
            } else {
                output += actual + Integer.toString(count);
                actual = c;
                count = 1;
            }
        }
        if (count > 0) {
            output += actual + Integer.toString(count);
        }
    }
    System.out.println(output);

}
}

关于java - Java 中的运行长度编码 - 意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53739125/

相关文章:

python - 如何使用循环检查输入是否已存在于 Python 文件中并追加(如果是新的)?

.net - 有没有办法在使用 System.IO.Compression.GZipStream 时设置压缩级别

Java-对 int 数组进行排序

java - 如果父级不使用 Java 中的 stdout/stderr,为什么进程会挂起?

C#:将 for(each) 循环组合成高效代码

python - 使用 python ping 多个远程服务器的故障排除脚本

java - 检查数据库中是否存在记录(来自大量数据)的有效方法(JPA/Hibernate)

java - 确定 ExecutorCompletionService 队列中已完成任务的数量

java - 解压缩带(嵌入)括号的 RLE 字符串时,递归如何工作?

c++ - 读取zlib/miniz压缩数据时出现DATA_ERROR