Подсчитать количество каждого символа в строке

1

Вы, наверное, смеетесь над тем, как я выполнил эту простую задачу. Я знаю, что есть более простой способ сделать это, но я просто не могу думать об этом прямо сейчас. Можете ли вы, ребята, помочь мне?

String sample = "hello world";
char arraysample[] = sample.toCharArray();
int length = sample.length();

//count the number of each letter in the string
int acount = 0;
int bcount = 0;
int ccount = 0;
int dcount = 0;
int ecount = 0;
int fcount = 0;
int gcount = 0;
int hcount = 0;
int icount = 0;
int jcount = 0;
int kcount = 0;
int lcount = 0;
int mcount = 0;
int ncount = 0;
int ocount = 0;
int pcount = 0;
int qcount = 0;
int rcount = 0;
int scount = 0;
int tcount = 0;
int ucount = 0;
int vcount = 0;
int wcount = 0;
int xcount = 0;
int ycount = 0;
int zcount = 0;

for (int i = 0; i < length; i++) {
    char c = arraysample[i];
    switch (c) {
        case 'a':
            acount++;
            break;
        case 'b':
            bcount++;
            break;
        case 'c':
            ccount++;
            break;
        case 'd':
            dcount++;
            break;
        case 'e':
            ecount++;
            break;
        case 'f':
            fcount++;
            break;
        case 'g':
            gcount++;
            break;
        case 'h':
            hcount++;
            break;
        case 'i':
            icount++;
            break;
        case 'j':
            jcount++;
            break;
        case 'k':
            kcount++;
            break;
        case 'l':
            lcount++;
            break;
        case 'm':
            mcount++;
            break;
        case 'n':
            ncount++;
            break;
        case 'o':
            ocount++;
            break;
        case 'p':
            pcount++;
            break;
        case 'q':
            qcount++;
            break;
        case 'r':
            rcount++;
            break;
        case 's':
            scount++;
            break;
        case 't':
            tcount++;
            break;
        case 'u':
            ucount++;
            break;
        case 'v':
            vcount++;
            break;
        case 'w':
            wcount++;
            break;
        case 'x':
            xcount++;
            break;
        case 'y':
            ycount++;
            break;
        case 'z':
            zcount++;
            break;
    }
}

System.out.println("There are " + hcount + " h in here ");
System.out.println("There are " + ocount + " o in here ");
Теги:
string
arrays
switch-statement
char

5 ответов

3
Лучший ответ

Попробуйте использовать массив, который использует ASCII-код:

int[] counters = new int[0x100];
for(int i = 0; i < string.length(); i++) {
    char c = string.charAt(i);
    counters[(int) c]++;
}
for(char c = 'a'; c <= 'z'; c++) {
    System.out.println("There are "+counters[(int) c]+" "+c+" in the String.");
}

То, что вы делаете, это выбор правильного персонажа (как вы уже делали). Теперь у каждого персонажа есть число. Вы можете посмотреть их здесь: https://en.wikipedia.org/wiki/ASCII. И вы увеличиваете счетчик.

Некоторые примечания (как ответ на комментарий Чак Лоури)

  • 0x100 - это шестнадцатеричное число, равное 256 числу возможных символов.
  • Датструктура - это простой массив. Это обеспечивает быстрый доступ и прирост. Хотя некоторые персонажи, возможно, не интересны, накладные расходы небрежны.

См. Jdoodle.

  • 1
    Пожалуйста, объясните в своем ответе, почему вы используете 0x100 для размера вашего массива. Также объясните, почему вы выбрали эту структуру данных.
  • 0
    лучше? [это место для размещения комментария]
Показать ещё 1 комментарий
0

Вы должны хранить "счет" в одном контейнере. В этом случае я думаю, что Map будет наиболее подходящей. Используя карту, вы храните часть информации на основе пары Key: Value любого объекта. В этом случае ваш ключ может быть символом (тип char), например 'a' или 'z', а ваше значение будет талином этого символа (тип int). Подробнее о Картах в API Java вы можете прочитать здесь.

Пример реализации

Map m = new Map();
m.put('c',11);  //this puts the Value eleven into the map for Key 'c'
m.get('c');   //this would return the value stored for char 'c', in this case 11

Если вам удобнее использовать Arrays, вы можете сохранить каждое значение char, чтобы индекс "a" был [0], индекс "b" count равен [1]. Или вы можете индексировать массив по значению ASCII каждого символа, попробуйте что-то вроде char ch = (int)'a'; который должен вернуть 97.

  • 0
    Это действительно будет работать, хотя я предполагаю, что HashMap ( Map - это интерфейс) создаст большое количество накладных расходов. Более того, даже возможно, что накладные расходы памяти будут больше (поскольку HashMap хранит ключи и некоторый вид LinkedList ).
0

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

EDIT: следующая страница также может оказаться полезной: Java: Как подсчитать количество вхождений символа в String?

EDIT # 2: Конечно, хорошая вещь в вашем подходе заключается в том, что вы только цикл через строку один раз.

0

Используйте массив, где индекс соответствует каждому символу

String str = "Hello World";
String strLower = str.toLowerCase();

int[] charCounts = new int[26];

for (int i = 0; i < strLower.length(); i++) {
  char c = strLower.charAt(i);
  int charIndex = (int)c - 97
  charCounts[charIndex]++;
}
0
public void countChars(String str) {
    int numOfChars = 'z' - 'a' + 1;
    int[] arr = new int[numOfChars];
    for (int i = 0; i < str.length(); i++) {
        arr[str.charAt(i) - 'a']++;
    }
    System.out.println("There are " + arr['z' - 'a'] + " z in here ");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню