Отображение количества символов в строке - PullRequest
1 голос
/ 28 ноября 2009

У меня вопрос по Java: я пишу программу для чтения строки и отображения количества символов в этой строке. Я нашел пример кода, но я не совсем понял последнюю часть - кто-нибудь может помочь?

int[] count = countLetters(line.toLowerCase());

for (int i=0; i<count.length; i++)
{
    if ((i + 1) % 10 == 0)
            System.out.println( (char) ('a' + i)+ " " + count[i]);
    else
        System.out.print( (char) ('a' + i)+ " " +  count[i]+ " ");
}

public static int[] countLetters(String line)
{
    int[] count = new int[26];

    for (int i = 0; i<line.length(); i++)
    {
        if (Character.isLetter(line.charAt(i)))
            count[(int)(line.charAt(i) - 'a')]++;
    }

    return count;
}

Ответы [ 5 ]

2 голосов
/ 28 ноября 2009

Ваш последний цикл:

Для каждого символа, который мы проверяем, является ли это буквой, если да, мы увеличиваем счетчик относительно этого символа. Это означает, что «a» равно 0, «b» равно 1 ... (другими словами, «a» это «a» - «a», что равно 0, «b» это «b» - «a», 1 ...).

Это распространенный способ подсчета количества вхождений символов в строку.

1 голос
/ 28 ноября 2009

Код, который вы опубликовали, учитывает не длину строки, а количество вхождений букв алфавита, которые встречаются в строке в нижнем регистре.

Character.isLetter(line.charAt(i))

возвращает символ в позиции i и возвращает true, если это буква.

count[(int)(line.charAt(i) - 'a')]++;

увеличивает число в индексе character - 'a', это от 0 до 26.

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

Цикл for для массива count завершает вывод на печать каждый десятый счет и использует

(char) ('a' + i)

чтобы распечатать письмо, которому принадлежит счет.

0 голосов
/ 28 ноября 2009

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

public static int[] countAllASCII(String line) {
  int[] count = new int[256];
  char[] chars = line.toCharArray();

  for (char c : chars) {
    int index = (int) c;
    if (index < 256) {
      count[index]++;
    }  
  }

  return count;
}

public static int[] countLetters(String line) {
    int[] countAll = countAll(line);        
    int[] result = new int[26];     
    System.arraycopy(countAll, (int) 'a', result, 0, 26); 

    return result;
}

Общая идея: метод countAll просто считает все символы. Да, массив больше, но в этих измерениях сегодня все равно. Преимущество: мне не нужно проверять каждый символ. Второй метод просто копирует интересующую область в новый (результирующий) массив и возвращает его.

EDIT

Я также изменил свой код для менее недружественного комментария. В любом случае, Бомба.

0 голосов
/ 28 ноября 2009

В методе countLetters цикл for проходит через все символы в строке. if проверяет, чтобы убедиться, что это буква, иначе она будет проигнорирована.

line.charAt() возвращает один символ в позиции i. Тип этого char.

Теперь глубоко в Java символ представляет собой просто число, соответствующее коду символа. Строчные буквы «a» имеют код символа 97, «b» - 98 и т. Д. (int) преобразование силы из char в int. Итак, мы берем код символа, допустим, что это «b», поэтому код равен 98, и мы вычитаем код для «a», который равен 97, поэтому мы получаем смещение 1 (от начала алфавита). Для любой буквы в алфавите смещение будет между 0 и 25 (включительно).

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

Цикл вверху использует обратный «трюк» для преобразования этих смещений от 0 до 25 обратно в буквы от a до z.

0 голосов
/ 28 ноября 2009

Полагаю, вы считаете буквы, а не символы ('5' также символ).

Последняя часть:

for (int i = 0; i<line.length(); i++)
{
    if (Character.isLetter(line.charAt(i)))
        count[(int)(line.charAt(i) - 'a')]++;
}

Он перебирает строку ввода и проверяет, является ли буква для каждого символа. Если это так, он увеличивает счетчик для этой буквы. Счет ведется в массиве из 26 целых чисел (для 26 букв латинского алфавита). Счет для буквы «а» хранится в индексе 0, буква «b» в 1, «z» в 25. Для получения индекса код вычитает значение «a» из значения буквы (каждый символ не только является символом / глиф, но также числовое значение). Поэтому, если буква «а», она вычитает значение «а», которое должно быть 0 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...