我不知道我做错了什么。我是在最后忘记了什么还是我错过了什么。

我要完成的工作是用户输入一个字符串,例如:aaabbcccc,然后输出:a3bbc4,因此任何包含3个或更多字符的字符都应显示字母,然后输入该字符的次数字符串。

我是在弄乱我看不见的地方还是在即将结束时给我输出结果?

TL; DR字符串输入:aaabbcccc输出:a3bbc4。让用户输入然后在尝试提供输出时给出错误。

跑:

Enter a string(only lowercase):    aaabb

Exception in thread "main" java.lang.NullPointerException

at hw9.RunLengthCode.compress(Hw9.java:26)

at hw9.RunLengthCode.getCText(Hw9.java:20)

at hw9.Hw9.main(Hw9.java:55)

C:\Users\extrapcuser\AppData\Local\NetBeans\Cache\8.1\executor-
snippets\run.xml:53: Java returned: 1

BUILD FAILED (total time: 5 seconds)


码:

import java.util.Scanner;

class RunLengthCode
{
    String str1;
    String cText;
    String pText;

    public String setPText(String str)
    {
        pText = str.toLowerCase();
        return pText;
    }
    public String getCText()
    {
        compress(cText);
        return cText;

    }
    public void compress(String str)
    {
        int count = 1;
        for(int i = 1; i < str1.length(); i++)
        {
            if(str1.charAt(i) == str1.charAt(i-1))
            {
                count++;
            }
            else if(count >= 3)
            {
                String stra = str.substring(0, i-count);
                String strb = str.substring(i-count+1, i-count+2);
                String strc = str.substring(i);
                str = stra + strb + count + strc;
                count = 1;
                i=1;
            }
        }
        if(count >= 3)
        {
            str = str.substring(0, str.length()-count+1);
        }
        cText = str;
    }
}

public class Hw9
{
      public static void main(String[] args)
      {
          Scanner in = new Scanner(System.in);
          RunLengthCode rLc = new RunLengthCode();

          System.out.print("Enter a string(only lowercase):    ");
          String pText = in.nextLine();

          rLc.setPText(pText);
          System.out.println(rLc.getCText());
      }
}

最佳答案

我在代码中发现了以下缺陷。


NullPointerException的原因是您没有初始化
字符串str1。并且您正在访问空引用。很明显
抛出NullPointerException
cText变量永远不会初始化。
compress方法逻辑不会给您期望的输出,并且您仅比较相邻字符。


我希望使用HashMapString中查找重复的字符。

import java.util.LinkedHashMap;


导入java.util.Scanner;

公共类DuplicateCharactersInString {

static LinkedHashMap<Character, Integer> charMap = new LinkedHashMap<Character, Integer>();

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

    System.out.print("Enter a string(only lowercase):    ");
    String pText = in.nextLine();
    pText = pText.toLowerCase();
    for (int i = 0; i < pText.length(); i++) {
        if (charMap.containsKey(pText.charAt(i))) {
            charMap.put(pText.charAt(i), charMap.get(pText.charAt(i)) + 1);
        } else {
            charMap.put(pText.charAt(i), 1);
        }
    }

    if (!charMap.isEmpty()) {
        StringBuilder builder = new StringBuilder();
        for (Character character : charMap.keySet()) {
            int value = charMap.get(character);
            if (value > 2) {
                builder.append(character);
                builder.append(value);
            } else {
                for (int i = 1; i <= value; i++) {
                    builder.append(character);
                }
            }
        }
        System.out.println(builder);
    } else {
        System.out.println("Please enter the string");
    }
}


}

输出:

Enter a string(only lowercase):    aaabbbcccccd


a3b3c5d

10-02 05:00