Как я могу найти появление последовательных символов с помощью Java? - PullRequest
0 голосов
/ 31 октября 2018

Я новичок в Java. Я понимаю, как использовать цикл for, чтобы пройти строку и посчитать, сколько раз встречается символ. Если у меня есть строка с именем x, которая инициализируется как «aaabbbcccaaa», я хочу, чтобы моя программа сообщала мне, что есть 3a, затем 3b, затем 3c, а затем 3a. Таким образом, будет выведено что-то вроде 3a3b3c3a.

У меня есть следующий код:

public class ConsequentChars{
  public static String chars ( String x ){
    int len = x.length();
    String charOccurs = "";
    int count = 0;
    for(int i=0;i<len;i++){
      for(int j=0;j<len;j++){
        if(x.charAt(i)==x.charAt(j)){
          count++;
        }
      }
      charOccurs+=Integer.toString(count)+x.charAt(i);
      count = 0;
    }
    return rle;
  }
  public static void main(String[] args){
    System.out.println(chars("aaaaabbbbcccdde"));
  }
}

Из кода выше я получаю:

5a5a5a5a5a4b4b4b4b3c3c3c2d2d1e.

Когда это должно быть:

5a4b3c2d1e.

Я не уверен, что я могу сделать, чтобы это исправить. Я ценю любую помощь:)

Ответы [ 5 ]

0 голосов
/ 31 октября 2018

Нет необходимости во вложенном цикле. Сравните charAt (i) с charAt (i + 1): если равно, добавьте +1, чтобы подсчитать счетчик concat и текущий символ в строке результата charOccurs и сбросить счетчик до 1

 public static String chars(String x) {
        int len = x.length();
        String charOccurs = "";
        int count = 1;
        for (int i = 0; i < len-1; i++) {
            if (x.charAt(i) == x.charAt(i+1)) {
                count++;
            }
            else{
                charOccurs = charOccurs + count + "" + x.charAt(i);
                count = 1;
            }
        }
        //add last char count and last char to result
        return charOccurs  + count + "" + x.charAt(len-1);
    }

    public static void main(String[] args) {
        System.out.println(chars("aaaaabbbbcccddd"));
    }
0 голосов
/ 31 октября 2018

Вы можете использовать вместо этого хэш-карту

public static void main(String[] args) {
String str = "aaaaabbbbcccdde";
char[] chars = str.toCharArray();
Map<Character, Integer> charsMap = new HashMap<>();
for (char c : chars) {
  if (charsMap.containsKey(c)) {
    Integer integer = charsMap.get(c);
    charsMap.put(c, integer + 1);
  } else {
    charsMap.put(c, 1);
  }
}
System.out.println(charsMap);

}

0 голосов
/ 31 октября 2018

Вы проходите строку слишком много раз с двумя циклами for. Из вопроса вы ищете только последовательные символы. Поэтому вам нужно всего лишь зациклить строку, отслеживая текущий символ и подсчитывая, сколько раз он встречается в одной и той же последовательности.

public static String chars ( String x ){
    int len = x.length();

    if(len <= 0)
        return "";

    String charOccurs = "";
    char currentChar = x.charAt(0);
    int count = 1;

    for(int i=1;i<=len;i++)
    {
        //this the check for the last character
        if(i == len)
        {
            if(currentChar != x.charAt(len - 1))
            {
                currentChar = x.charAt(len - 1);
                count = 1;
            }
            charOccurs+=Integer.toString(count)+currentChar;
        }
        //this is to check if we have the same char as the previous
        else if(x.charAt(i) == currentChar)
        {
          count++;
        }
        //we have hit a new character and need to add to our string, change the current char and reset the count
        else
        {
            charOccurs+=Integer.toString(count)+currentChar;
            currentChar = x.charAt(i);
            count = 1;
        }
    }
    return charOccurs;
  }

выход

5a4b3c2d1e
0 голосов
/ 31 октября 2018

Для каждого символа строки вы должны перебирать оставшуюся часть строки, считая вхождения одного и того же символа, пока не найдете другой символ. Затем вы делаете то же самое, но начиная с последней позиции, где был найден другой символ. Это:

public static String chars (String x){
    int len = x.length();

    String charOccurs = "";

    int count = 0;
    int i = 0;
    while (i < len) {
        char c = x.charAt(i);
        count = 1;

        for (int j = i + 1; j < len; j++) {
            if (c == x.charAt(j)) {
                count++;
            } else {
                break;
            }
        }
        charOccurs+= "" + count + c;
        i+=count;
    }

    return charOccurs;
}

public static void main(String[] args) {
    System.out.println(chars("aaaaabbbbcccdde"));
}

напечатает:

5a4b3c2d1e
0 голосов
/ 31 октября 2018

В вашем коде проблема в том, что для каждого символа вы идете вперед и подсчитываете, сколько раз этот символ появляется в строке. Итак, для строки «aabab» вы начинаете с первого «a», подсчитываете, сколько раз «a» появляется во всей строке, и делаете его «a3». Но затем вы переходите к следующей строке и делаете то же самое, где подсчитываете количество раз, когда «a» появляется во всей строке, которая по-прежнему равна 3, делая вашу строку «a3a3». Чтобы это исправить, вам нужно остановить этот повторяющийся шаг. Если вы хотите сохранить свой текущий код для обучения, я бы рекомендовал сохранить список символов, которые вы уже распечатали, и не печатать их снова. Итак, внутри первого цикла for вы хотите что-то вроде

if(character hasn't appeared before){
    count the number of time it has appeared and append it to the output ` 
}

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

...