Метод сжатия строк не возвращает новую строку? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь создать метод, который сжимает строку. Например, метод будет принимать «ttttesst» и возвращать «4te2st».

Когда я запускаю метод и печатаю результат, я получаю: ""

public class Compress {

public static String compress(String original){
    int count = 1;
    int oglength = original.length()-1;
    StringBuilder newword = new StringBuilder("");
    for(int i = 0; i < oglength; i = i+count){
        count = 1;
        for(int k = 1; k < oglength-k-i; k++){
            if(original.charAt(i) == original.charAt(i+k)){
                count++;
                continue;
            } else if(original.charAt(i) != original.charAt(i+k) && original.indexOf(original.charAt(i+k)) - original.indexOf(original.charAt(i)) > 1){
                newword.append(newword);
                newword.append(count);
                newword.append(original.charAt(i));
                break;
            } else if(original.charAt(i) != original.charAt(i+k) && original.indexOf(original.charAt(i+k)) - original.indexOf(original.charAt(i)) == 1){
                newword.append(newword);
                newword.append(original.charAt(i));
                count++;
                break;
            }
        }
    }
    String returnword = newword.toString();
    return returnword;
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я думаю, что вы запутались в своей программе, поскольку у вас есть unnnecessary loops, который увеличивает сложность, и if-else ladder, который сравнивает символы, которые вы не можете отследить в своем уме (в этом вам может помочь debugging) .

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

Note: Я принял во внимание только основные сценарии. Для большого количества тестовых случаев могут потребоваться небольшие изменения.

public class Demo {

public static String compress(String original){
    int count = 0;
    char temp = original.charAt(0);
    StringBuilder sb = new StringBuilder("");
    for(int i=0;i<original.length();i++) {

        if(original.charAt(i)==temp) {
            count++;
        }else {
            if(count!=1)
                sb.append(count).append(temp);
            else
                sb.append(temp);

            count=1;

            temp=original.charAt(i);
            continue;
        }

    }
    if(count!=1)
        sb.append(count).append(temp);
    else
        sb.append(temp);
    //Above four lines get last character 
    //and its occurrence if it's more than 1. 


    return sb.toString();
}

public static void main(String args[]) {
    System.out.println(compress("ttttesst")); 
//Enter desired String value here.
//Also you may make it user-interactive.
}
}

Также вы можете ссылаться на следующие ссылки, Подсчет количества появлений символов и Реализация HashMap и Хеширование используется для подсчета появления символа , чтобы лучше понять, как подходить к таким проблемам.

Надеюсь, это поможет!

0 голосов
/ 08 ноября 2018

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

Вот рабочая версия, основанная на вашем подходе:

public static String compress(String original) {
    int count;
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < original.length(); i = i + count) {
        count = 1;
        for (int k = i + 1; k < original.length(); k++) {
            if (original.charAt(i) == original.charAt(k)) {
                count++;
            } else {
                break;
            }
        }

        if (count > 1) {
            builder.append(count).append(original.charAt(i));
        } else {
            builder.append(original.charAt(i));
        }
    }
    return builder.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...