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

时间:2019-04-02 11:22:44

标签: java arrays frequency

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

例如:

I / O:Sssgs

O / P:S1s2g1s1

对每个字符的出现进行计数将得出全部计数的计数,而与相邻字符不存在无关。篡改i和j循环会出现OutOfBounds错误。

      //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]);
        }
    }

输入的是> HelloWorld

预期输出应为> H1 e1 l2 o1 W1 o1 r1 l1 d1

4 个答案:

答案 0 :(得分:1)

我刚刚在您的代码中做了一些更正,下面是它的样子:

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”的输出为“ H1e1l2o1W1o1r1l1d1”

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我讨厌这种解决方案,但是我猜您由于需要而使用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次),并将最近读取的char与新的char进行比较。如果它们匹配,则增加该字符的出现次数。如果不是,则打印它们并将新的字符设置为最后读取的字符。 当您结束阅读单词时,请打印最后阅读的字符。

始终记住保持简单!并进行消毒(如果收到null或空值,则在此代码中将得到一个nullPointer,只需将其写在那里指出即可)。

答案 3 :(得分:0)

我想到了这个

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一起使用