Run Length Encoding в Java - непреднамеренный вывод - PullRequest
0 голосов
/ 12 декабря 2018

Мне было поручено выполнить задание для моего класса на Java.Это в основном программа кодирования длины прогона, которая проходит через введенную строку и сжимает ее (например: 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, но это тоже может быть неправильно.Большое вам спасибо!

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Другой вариант сделать так:

    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());
0 голосов
/ 12 декабря 2018

Во-первых, вы не должны использовать переменный ввод для ввода и вывода.Это затрудняет чтение и, возможно, приводит к ошибкам.Чем вы должны проверить на пустой ввод.После этого вам просто нужен один цикл, в котором вы выбираете персонажа, сравните его со следующими.Если это то же самое, увеличьте счетчик, если не добавьте его к выходу с счетчиком, сбросьте символ и счетчик и продолжайте.В конце вы должны проверить, остался ли какой-нибудь отдых.

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

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...