Java: отображать количество раз, когда письмо появляется в строке - PullRequest
1 голос
/ 30 сентября 2010

Это из области упражнений Sun, так что я полагаю, что это домашняя работа.

Я знаю, как использовать цикл for для итерации строки, но я хочу изучать массивы, пока я в ней, и сохранять ихв так.Это то, что я получил до сих пор:

BufferedReader in = new BufferedReader(new FileReader("xanadu.txt"));
int c;
char letters[] = new char[27]; //26 + newline?

while((c = in.read()) != -1){
    letters[(char)c] += 1; //store in index, so letters['a'] = 4 etc..
}

Теперь по какой-то причине (работает на других языках) он не преобразует int c в char должным образом и вводит letters[110] или что-то ввместо десятичной ASCII, конечно, это выходит за пределы моего массива.

Каким образом я должен решить эту проблему, чтобы иметь хороший индекс символов?

Ответы [ 6 ]

3 голосов
/ 30 сентября 2010

Ну, во-первых, System.out.println((int) 'A'); не даст вам 0 или 1, это даст вам 65, поэтому вы должны хотя бы сделать letters[(char) c - 'A'] += 1.

Тем не менеерассмотрели только 27 букв, которые включают только нижний регистр?или верхний регистр?нет пробелов?и так далее ...

Вы, вероятно, хотите сделать что-то вроде

Map<Character, Integer> counts = new HashMap<Character, Integer>();

BufferedReader in = new BufferedReader(new FileReader("data.txt"));
int c;
while((c = in.read()) != -1) {
    int count = counts.containsKey((char) c) ? counts.get((char) c) : 0;
    counts.put((char) c, count + 1);
}
2 голосов
/ 30 сентября 2010

Я был бы заинтригован, узнав, на каких языках работает этот . Каждый язык, который я когда-либо использовал, будет преобразовывать значения символов в целые числа, используя Unicode (например, Java) или встроенную кодировку символов, обычно ASCII-совместимый. Какой язык будет конвертировать 'a' в 0 или 1?

В любом случае, самое простое изменение, которое заставит ваш код работать в любых ситуациях, будет:

// char values in Java are in the range 0-65535.
int letters[] = new int[65536];

Обратите внимание, что я изменил тип массива с char на int, потому что каждый элемент должен быть числом, а не символом.

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

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

2 голосов
/ 30 сентября 2010

вы можете использовать карту.

1 голос
/ 30 сентября 2010

letters[(char)c] += 1; //store in index, so letters['a'] = 4 etc..

Насколько я понимаю, вы хотите, чтобы ваш массив букв был похож на эти буквы ['a'] = (некоторое значение) буквы ['b'] = (некоторое значение)

В Java массивы могут индексироваться только целыми числами или в других типах данных (они будут преобразованы в 'int') Спецификация языка Java

Ближайший, который вы можете использоватьтакое Карты - HashMap или TreeMap

1 голос
/ 30 сентября 2010

Почему бы вам не сделать буквы массивом целых чисел, и, во-вторых, я думаю, что (letters [(char) c]) вернул бы значение ASCII, так что, вероятно, что-то вроде

letters [c-97]+ = 1 сделает трюк

1 голос
/ 30 сентября 2010

Я не думаю, что Java поддерживает такую ​​индексацию массива (как PHP). Только цифры и только начиная с нуля до размера-1.

Таким образом, массив не является хорошим решением здесь. Как предполагает foret, вам придется использовать карту , например Hashmap .

...