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

时间:2018-12-12 08:46:24

标签: java loops compression

我被分配为我的Java课做任务。它基本上是一个游程编码程序,可以遍历输入的字符串并将其压缩(例如:aaaabbb变为a4b3)

过程:

我的代码遍历输入字符串中的每个字符,并检查原始字符是否等于下一个字符。如果为true,则它将增加计数,最后将计数和原始字母连接起来。如果原始字母不等于下一个字符-它从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循环,但这也可能是错误的。非常感谢!

2 个答案:

答案 0 :(得分:2)

首先,您不应将变量输入用于输入和输出。这使其难以阅读,并可能产生错误。比您应该检查输入是否为空。之后,您只需要选择一个字符的一个循环,即可将其与以下字符进行比较。如果相同,则增加一个计数器,如果不增加计数,则将其添加到输出中,重置字符和计数器,然后继续。最后,您必须检查是否还需要休息。

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

}
}

答案 1 :(得分:1)

另一个选择是这样做:

    Scanner sc = new Scanner(System.in);
    String input = sc.next();
    StringBuilder builder = new StringBuilder();

    char c = input.charAt(0);
    int count = 0;
    for (int i = 0; i < input.length(); i++) {
        if (!Objects.equals(c, input.charAt(i))) {
            builder.append(c);
            builder.append(count);
            c = input.charAt(i);
            count = 1;
        } else {
            count++;
        }
        if (input.length() - 1 == i) {
            builder.append(c);
            builder.append(count);
        }
    }

    System.out.println(builder.toString());