Вы, наверное, смеетесь над тем, как я выполнил эту простую задачу. Я знаю, что есть более простой способ сделать это, но я просто не могу думать об этом прямо сейчас. Можете ли вы, ребята, помочь мне?
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 ");
Попробуйте использовать массив, который использует 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.
Вы должны хранить "счет" в одном контейнере. В этом случае я думаю, что 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.
HashMap
( Map
- это интерфейс) создаст большое количество накладных расходов. Более того, даже возможно, что накладные расходы памяти будут больше (поскольку HashMap
хранит ключи и некоторый вид LinkedList
).
Вы можете создать функцию, которая использовала бы регулярное выражение для извлечения строки, содержащей конкатенацию всех вхождений данной буквы, заданных как параметр, и возвращает длину этой строки.
EDIT: следующая страница также может оказаться полезной: Java: Как подсчитать количество вхождений символа в String?
EDIT # 2: Конечно, хорошая вещь в вашем подходе заключается в том, что вы только цикл через строку один раз.
Используйте массив, где индекс соответствует каждому символу
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]++;
}
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 ");
}
0x100
для размера вашего массива. Также объясните, почему вы выбрали эту структуру данных.