TreeMap - Как найти количество слов, которые начинаются с каждой буквы алфавита - PullRequest
0 голосов
/ 02 октября 2018

Итак, у меня есть список слов.Например, {Apple, Available, Art, Between, Beyond, Door, Drive, ......}

, и я хочу показать количество слов, начинающихся с каждой буквы алфавита, поэтомурезультат должен выглядеть следующим образом: A = 3, B = 2, D = 2, ......

Вот код, который я написал, но, очевидно, он работал не так, как я хотел.

    Map<String, Integer> myMap = new TreeMap<String, Integer>();

    for (int i = 0; i < theWords.length; i++) {
        for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) {
            int numOfWords = 0;
            char firstLetter = theWords[i].charAt(0);
            if (firstLetter == alphabet) {
                myMap.put(String.valueOf(alphabet), numOfWords + 1);
            }
        }   
    }
    System.out.println(myMap);

И вот результат, который я получил ...

{A=1, B=1, C=1, D=1, E=1, F=1, G=1, H=1, J=1, K=1, L=1, M=1, N=1, O=1, P=1, Q=1, R=1, S=1, T=1, U=1, W=1, Y=1}

PS Я должен использовать TreeMap.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Вместо двойного цикла вы можете получить первый символ и добавить его на карту.

Что-то похожее на:

for (String fruit : theFruits) {
  String firstLetter = fruit.substring(0, 1);
  Integer count = myMap.get(firstLetter);
  if (count == null) {
    myMap.put(firstLetter, 1);
  }
  else {
    myMap.put(firstLetter, ++count);
  }
}
0 голосов
/ 02 октября 2018

Карта сопоставляет ключ со значением, где ключ уникален.

  1. Создайте карту.
  2. Для каждого слова в списке извлеките первый символ.
  3. Посмотрите, присутствует ли выбранный символ в наборе ключей карты.
  4. Если он присутствует, просто увеличьте счетчик для этого ключа, иначе сделайте новую запись на карте и оставьте счет равным 1.

Для вашей задачи вы можете просто взять массив типа int размера 26. Это будет действовать как ваша карта.

0-й индекс для a, 1-й индекс для b и так далее до 25-го индекса для z.

Теперь примените вышеуказанную логику

, например, если список слов

String[] wordList = { "apple", "mango", "berry", "rice", "banana"} ;

int [] map = new int [26]; //by default all elements initialized with 0
for(int i =0; i < wordList.length; i++){
     char first = wordList[i].charAt(0);
     int index = first - 'a';
     map[index] = map[index] + 1;
}

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

PS Обычно для поиска префиксов предпочтительным решением является Три.

0 голосов
/ 02 октября 2018

вы устанавливаете int numOfWords = 0; во внутреннем цикле - это так.Вот почему это всегда 1 положить на карту

...