Подсчет прописных и строчных символов строки и добавление счетчика к символу

Я пытаюсь распечатать вывод строки, чтобы найти в ней количество прописных и строчных букв.

Например. если строка = "AaaBBbCc", мне нужен вывод как: "A1a2B2b1C1c1".

т.е. подсчет прописных букв «А», затем подсчет строчных букв «а» с добавлением символов.

Ниже приведен фрагмент кода до того места, где я это сделал. Может кто подскажет как пойдет. Я знаю, что код не на должном уровне :(

public static void main(String[] args) {
    String str = "AaaBBbCc";
    int upperCount=0;
    int lowerCount=0;

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        if(ch>='A' && ch<='Z'){
             upperCount++;
             System.out.println("Uppercase letter is : "+ch+upperCount);

    }
     if(ch>='a' && ch<='z'){
        lowerCount++;
        System.out.println("Lower case letter is : "+ch+lowerCount);
    }
}
    System.out.println("upper count is :"+upperCount+" & lower count is: "+lowerCount);     

}


person Ankush_Chauhan    schedule 14.03.2016    source источник
comment
Все ли одинаковые буквы всегда рядом друг с другом, как в вашем примере? Будут ли когда-нибудь в строке небуквенные символы?   -  person Andy Turner    schedule 14.03.2016
comment
if (Character.isUpperCase(ch)) / if (Character.isLowerCase(ch))   -  person khelwood    schedule 14.03.2016
comment
@AndyTurner А, хорошо, я внимательно посмотрел на код и пропустил текст.   -  person Johannes Jander    schedule 14.03.2016


Ответы (2)


То, что вы пытаетесь здесь выполнить, называется кодированием длины цикла. Иногда это называют формой сжатия данных без потерь, при которой длина непрерывного символа добавляется к одному экземпляру этого символа. Вот модифицированная версия из RosettaCode, которая должна вам помочь:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RunLengthEncoding {

    public static String encode(String source) {
        StringBuffer dest = new StringBuffer();
        for (int i = 0; i < source.length(); i++) {
            int runLength = 1;
            while (i+1 < source.length() && source.charAt(i) == source.charAt(i+1)) {
                runLength++;
                i++;
            }
            /* We will swap these so they fit your format of [Letter][Count]
            dest.append(runLength);
            dest.append(source.charAt(i));
            */
            dest.append(source.charAt(i));
            dest.append(runLength);
        }
        return dest.toString();
    }

    public static void main(String[] args) {
        String example = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW";
        System.out.println(encode(example));
    }
}
person MrPublic    schedule 14.03.2016
comment
Что произойдет, если входная строка будет AaBBAAAaCac ?? Я думаю, ответ должен быть A4a3B2C1c1, не так ли? - person Ataur Rahman Munna; 14.03.2016
comment
@AtaurRahmanMunna Исходный вопрос кажется немного неясным относительно того, хотят ли они просто подсчет всех прописных и строчных букв (из-за System.out.println("upper count is :"+upperCount+" & lower count is: "+lowerCount);), что-то точно такое же, как кодирование длин серий (например, из-за того, что если строка = AaaBBbCc, мне нужен вывод как: A1a2B2b1C1c1.), или что-то вроде того, что вы сказали, где вывод расположен в алфавитном порядке с каждым количеством символов, появляющимся после буквы (из того, что вы сказали). - person MrPublic; 14.03.2016

Ты на правильном пути. Если вы хотите подсчитать, какие буквы появляются, а не только в верхнем или нижнем регистре, вы можете создать 2 массива int[] upperCaseCount и lowerCaseCount = new int[26]. Вы можете использовать эти массивы для подсчета появляющихся букв.

Подсказка: вы можете использовать тот факт, что char можно использовать как int, чтобы определить, какой индекс следует увеличить:

int index = ? //'a' should be 0 for lower, and 'A' should be 0 for upper
lowerCaseCount[index]++ or upperCaseCount[index]++; 
person Maljam    schedule 14.03.2016