Очереди использования для подсчета строк - PullRequest
0 голосов
/ 16 ноября 2018

У меня проблема с этой программой.Схема использования, пользователь должен ввести число (сколько строк ввести), а затем это количество строк.

Пример:

2
ASSSDDDAAA 
AAALLLOOOLLL

Затем программа должна рассчитать количествоповторяющиеся символы в строке и указание количества суффиксов.

Вывод (на основе приведенного выше примера строки):

AS3D3A3
A3L3O3L3

Должен использоваться ярлыки для вставляемых строк.Проблема в том, что я должен поставить в очередь две строки, но когда программа работает, я никогда не получаю вывод из второй строки, более того, в первой строке я никогда не получаю последнюю в этом примере A3, это похоже на то, что программа ее не видит (я написал ASSSDDDAAA иЯ получаю AS3D3 IDK почему).

public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    Queue<String> kolejkaWyrazow = new LinkedList<String>();
    String wyraz;

    System.out.println("Podaj liczbe ciagow liczbowych");
    int liczbaCiagowWyrazowych = scanner.nextInt();
    for(int i = 0; i <= liczbaCiagowWyrazowych; i++) {
        wyraz = scanner.nextLine();
        kolejkaWyrazow.add(wyraz);
    }

    MarkerCutt(kolejkaWyrazow);

}

private static void MarkerCutt(Queue<String> kolejkaWyrazow) {

    String box;
    int countRepeats;

    for(int i = 0; i <= kolejkaWyrazow.size(); i++) {
        box = kolejkaWyrazow.remove();
        countRepeats = 1;
        for(int k = 0; k < box.length(); k++) {
            if (box.charAt(k) == box.charAt(k + 1)) {
                countRepeats++;
            } else {
                System.out.print(box.charAt(k));
                if (countRepeats <= 2) {
                    System.out.print(box.charAt(k));
                    countRepeats = 1;
                }
                if (countRepeats >= 3) {
                    System.out.print(countRepeats);
                    countRepeats = 1;
                }
            }
        }
    }
}

}

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018
public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    Queue<String> kolejkaWyrazow = new LinkedList<String>();
    String wyraz;

    System.out.println("Podaj liczbe ciagow liczbowych");
    int iCount = scanner.nextInt();
    for (int i = 0; i <= iCount; i++) {
        wyraz = scanner.nextLine();

        if (wyraz.trim().length() > 0) {
            kolejkaWyrazow.add(wyraz);
        }
    }

    MarkerCutt(kolejkaWyrazow);
}

Когда вы вводите число и нажимаете «Enter», в kolejkaWyrazow будет добавлена ​​пустая строка, поэтому я добавил «if (wyraz.trim (). Length ()> 0)», чтобы избежать этого

Затем я переписываю ваш метод MarkerCutt, см. Ниже

private static void MarkerCutt(Queue<String> queue) {
    for (int i = 0; i <= queue.size(); i++) {
        StringBuilder sb = new StringBuilder();
        String box = queue.remove();

        char c = box.charAt(0);
        int iCount = 1;

        for (int j = 1; j < box.length(); j++) {
            if (box.charAt(j) == c) {
                iCount++;
            } else {
                sb.append(c + "" + iCount);

                c = box.charAt(j);
                iCount = 1;
            }
        }

        sb.append(c + "" + iCount);

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

Тест:

Podaj liczbe ciagow liczbowych
2
ASSSDDDAAA
AAALLLOOOLLL

Результат

A1S3D3A3
A3L3O3L3

Если вы этого не сделаетехотите напечатать счетчик для символа, который не повторяется (count = 1):

Изменить

sb.append(c + "" + iCount);

на

sb.append(c + "" + (iCount > 1 : iCount : ""));

Тест

Podaj liczbe ciagow liczbowych
2
ASSSDDDAAA
AAALLLOOOLLL

Результат:

AS3D3A3
A3L3O3L3
0 голосов
/ 16 ноября 2018

Исходя из исходного кода OP, существует проблема с циклом for, заключающаяся в том, что проверка следующего символа переполняет конец строки, что приводит к ошибке времени выполнения.

Что касаетсяотсутствие вывода для последней записи в данном String box, это связано с тем, что вывод производится в цикле for самого box.length().Таким образом, когда в конце есть символ, который повторяется, он никогда не отображается.Я подозреваю, что та же самая проблема (без заключительного символа) может быть замечена с чем-то вроде AAABBBC, который должен отображать A3B3C, но не будет иметь последний C.

Слегка измененный алгоритм будетвсегда отображать символ при его изменении, а затем добавлять счетчик при необходимости.

private static void MarkerCutt(Queue<String> kolejkaWyrazow)
{

    // the string we are processing from the queue
    String box;

    // number of repeats for a character in the string
    int countRepeats;

    while (!kolejkaWyrazow.isEmpty()) {
        box = kolejkaWyrazow.remove();
        countRepeats = 0;
        // we hold the current character and the previous character;
        //  at entry, set the prevChar to something that cannot be matched
        char curChar, prevChar = '\0';

        // loop over the whole string; as we are not looking ahead, we
        //  use the full length of the String
        for (int k = 0; k < box.length(); k++) {

            // get the character
            curChar = box.charAt(k);

            // if we are not the same as the previous, then we
            //   may need to output the count; but output the character
            //   we just found, regardless
            if (curChar != prevChar) {
                outputCount(countRepeats);
                countRepeats = 0;
                System.out.print(curChar);
            }
            else {
                ++countRepeats;
            }
            prevChar = curChar;
        }
        // have to output the end of the string
        outputCount(countRepeats);
        System.out.println();
    }
}

private static void outputCount(int countRepeats) 
{
    if (countRepeats > 0) {
        System.out.print(countRepeats + 1);
    }
}

Вывод на основе показанных входов (плюс AAABBBC и 'AAABBBCC`:

AS3D3A3
A3L3O3L3
A3B3C
A3B3C2

В более широкой теме я хотел бы рассмотреть вопрос об удалении фактического вывода из метода MarkerCutt и вместо этого иметь метод, возвращающий строку. Обычно рекомендуется отделить вывод от логики. Итак:

private static void MarkerCutt(Queue<String> kolejkaWyrazow)
{


    while (!kolejkaWyrazow.isEmpty()) {
        String box = kolejkaWyrazow.remove();
        String repString = changeToRepeatCount(box);
        System.out.println(repString);
    }
}

private static String changeToRepeatCount(String box)
{
    // number of repeats for a character in the string
    int countRepeats = 0;

    // We build into this structure
    StringBuilder sb = new StringBuilder();

    // we hold the current character and the previous character;
    //  at entry, set the prevChar to something that cannot be matched
    char curChar, prevChar = '\0';

    // loop over the whole string; as we are not looking ahead, we
    //  use the full length of the String
    for (int k = 0; k < box.length(); k++) {

        // get the character
        curChar = box.charAt(k);

        // if we are not the same as the previous, then we may need
        if (curChar != prevChar) {
            outputCount(countRepeats, sb);
            countRepeats = 0;
            sb.append(curChar);
        }
        else {
            ++countRepeats;
        }
        prevChar = curChar;
    }
    // have to output the end of the string
    outputCount(countRepeats, sb);

    return sb.toString();
}

private static void outputCount(int countRepeats, StringBuilder sb) 
{
    if (countRepeats > 0) {
        sb.append(countRepeats + 1);
    }
}

Этот последний подход позволяет проводить более качественное / автоматизированное тестирование, потому что затем можно написать драйвер, который выполняет что-то вроде:

String inp = "ASSSDDDAAA";
    String exp = "AS3D3A3";
    String res = changeToRepeatCount(inp);
    if (! exp.equals(res)) {
        System.err.println("Test Failed!");
    }

(или лучше использовать JUnit или что-то в этом роде). Это значительно упростит разработкучем необходимость каждый раз вводить значение для проверки кода. Просто немного пищи для размышлений.

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