Подсчитайте, сколько раз символ появляется в строке подряд - PullRequest
5 голосов
/ 02 апреля 2019

Я новичок в Java.Я пытаюсь напечатать символы, присутствующие в строке, вместе с их количеством.Счетчик увеличивается только в том случае, если рядом с ним присутствует тот же символ.

Пример:

Ввод / вывод: 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 ]

1 голос
/ 02 апреля 2019

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

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); 
1 голос
/ 02 апреля 2019

Я только что внес некоторые исправления в ваш код, и ниже он выглядит так:

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»

0 голосов
/ 02 апреля 2019

Я придумал это:

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

0 голосов
/ 02 апреля 2019

Я ненавижу это решение, но, думаю, вы используете char [] из-за потребностей. Если не обязательно, я бы порекомендовал вам использовать 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

Объяснение: Прочитайте все слово только один раз (обратите внимание, что вы делали 3 раза цикл for) и сравните последний прочитанный символ с новым. Если они совпадают, увеличьте количество вхождений этого символа. Если это не так, то вы распечатываете их и устанавливаете новый символ как последний прочитанный. Когда вы закончите читать слово, напечатайте последний прочитанный символ.

Всегда помни, чтобы все было просто! И продезинфицировать (вы получите nullPointer в этом коде, если получите null или empty, просто напишите его там, чтобы указать на это).

...