有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java计数字符在字符串中以连续方式出现的次数

我是Java新手。我正在尝试打印字符串中的字符及其计数。仅当同一字符出现在其旁边时,计数才会增加

例:

输入/输出:Sssgs

O/p:S1s2g1s1

计数每个字符的出现次数将给出完整计数的计数,而不管字符之间是否相邻。篡改i&;j循环给出了边界外误差

      //ch[] is the String converted to a character array.
     //count[] is an array to store count of the characters      

    //Checks if present char and next char are same and increments count
    for(int i=0;i<ch.length;i++)    
    {
        count[i]=0;
        for(int j=0;j<ch.length;j++)
        {
            if(ch[i]==ch[j])
            {
                count[i]++;
            }
        }
    }

    //Prints Distinct char
    for(int i=0;i<ch.length;i++)
    {
        int j;
        for(j=0;j<i;j++)
        {
            if(ch[i]==ch[j])
            {
                break;
            }
        }

        if(i==j)
        {
            System.out.print(ch[i]+" "+count[i]);
        }
    }

输入为>;地狱世界

预期输出应为>;H1E1 l2 o1 W1 o1 r1 l1 d1


共 (4) 个答案

  1. # 1 楼答案

    我想到了这个:

    public static String count(String in) {
        if (in == null || in.isEmpty()) {
            return in;
        }
        int length = in.length();
        if (length == 1) {
            return in + '1';
        }
        StringBuilder out = new StringBuilder(length << 1);
    
        char previous = in.charAt(0);
        int count = 1;
        for (int i = 1; i < length; i++) {
            char current = in.charAt(i);
            if (previous == current) {
                count++;
            } else {
                out.append(previous).append(count);
                previous = current;
                count = 1;
            }
        }
        return out.append(previous).append(count).toString();
    }
    

    处理空字符串和空字符串。和带有length == 1的字符串(即string + 1

    此解决方案也不需要创建额外的char[]数组,因为它正在使用charAt

  2. # 2 楼答案

    我讨厌这个解决方案,但我想您使用char[]是因为需要。如果不是强制性的,我建议您使用Lino建议的StringBuilder

    char blankChar = " ".charAt(0);
    if (stringInput == null || "".equals(stringInput)) {
        System.out.println("Empty input");
    }
    char[] ch = stringInput.toCharArray();
    char lastChar = ch[0];
    int numAppearanceslastChar = 0;
    for (char element : ch) {
        if (element == blankChar) {
            continue;
        }
        if (lastChar == element) {
            numAppearanceslastChar++;
        } else {
            System.out.print(lastChar+""+numAppearanceslastChar+" ");
            lastChar = element;
            numAppearanceslastChar = 1;
        }
    }
    System.out.println(lastChar+""+numAppearanceslastChar+" ");
    

    输出:H1 e1 l2 o1 w1 o1 r1 l1 d1

    说明:只需阅读整个单词一次(注意,您将在for循环中执行3次),并将上次读取的字符与新字符进行比较。如果匹配,则增加该字符的出现次数。如果不是,则打印它们并将新字符设置为最后一次读取。 当你结束读单词时,打印最后读到的字符

    永远记住保持简单!和清理(如果接收到null或空值,您将在代码中获得一个null指针,只需将其写入其中以指出它)

  3. # 3 楼答案

    这是一个simpe解决方案,它不使用任何额外的数组,而是在下一个数组不同时直接打印计数的字符

    char prevChar = ch[0];
    int count = 1;
    for (int i = 1; i < ch.length; i++) {
      if (ch[i] != prevChar) {
        System.out.printf("%c%d ", prevChar, count);
        count = 1;
        prevChar = ch[i];
      } else {
        count++;
      }
    }
    System.out.printf("%c%d ", prevChar, count); 
    
  4. # 4 楼答案

    我刚刚对您的代码进行了一些更正,下面是它的外观:

    public static void main(String[] args) {
        String s = "Sssgs";
        char[] ch = s.toCharArray();
        int[] count = new int[20];
    
           for(int i=0;i<ch.length;i++)    
            {
                count[i]=0;
                for(int j=i;j<ch.length;j++)
                {
                    if(ch[i]==ch[j])
                    {
                        count[i]++;
                    } else {
                        break;
                    }
                }
            }
    
            //Prints Distinct char
            for(int i=0;i<ch.length;i += count[i])
            {
                System.out.print(ch[i] + "" +count[i]);
            }
    }
    

    当我只读取字符和它的出现次数,然后在迭代中跳转该数字时,大多数更改是在打印区中。它让我停在下一个不同的角色上

    “Sssgs”的输出为“S1s2g1s1”,“HelloWorld”的输出为“H1E1L2O1W1O1R1D1”