Получить все символы из строки с их номером - PullRequest
3 голосов
/ 31 мая 2010

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

i-2, a-2, r-2, m-1 и т. Д.

Ответы [ 3 ]

4 голосов
/ 31 мая 2010

Просто составьте карту каждого персонажа и его количества. Вы можете получить массив символов String, используя String#toCharArray(), и пройти через него, используя , расширенный для цикла . На каждой итерации получайте счетчик из сопоставления, устанавливайте его, если он отсутствует, а затем увеличивайте его на 1 и возвращайте в карту. Довольно просто.

Вот базовый пример:

String string = "I am really busy right now";
Map<Character, Integer> characterCounts = new HashMap<Character, Integer>();
for (char character : string.toCharArray()) {
    Integer characterCount = characterCounts.get(character);
    if (characterCount == null) {
        characterCount = 0;
    }
    characterCounts.put(character, characterCount + 1);
}

Чтобы узнать больше о картах, ознакомьтесь с учебником Sun по теме .


Вы прокомментировали, что это «для проекта», но, тем не менее, это типичный домашний вопрос, потому что он довольно простой и описан в первых главах приличной книги / учебника по Java. Если вы новичок в Java, я предлагаю пройтись по Sun Trails, покрывающим основы .

0 голосов
/ 31 мая 2010

Я не уверен в ваших точных потребностях, но кажется, что вы хотите считать события независимо от регистра, возможно также игнорировать такие символы, как пробел и т. Д. Поэтому вы можете захотеть что-то вроде этого:

String initial = "I   am really   busy  right now";

String cleaned = initial.replaceAll("\\s", "") //remove all whitespace characters
        .toLowerCase(); // lower all characters

Map<Character, Integer> map = new HashMap<Character, Integer>();
for (char character : cleaned.toCharArray()) {
    Integer count = map.get(character);
    count = (count!=null) ? count + 1 : 1;
    map.put(character, count);
}

for (Map.Entry<Character, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " : " + entry.getValue());
}

Настройте регулярное выражение, чтобы оно точно соответствовало вашим требованиям (чтобы пропустить пунктуацию и т. Д.).

0 голосов
/ 31 мая 2010

Это домашнее задание? Не зная этого, я приму наилучший ответ.

Логика вашей проблемы заключается в

  • зайдите в список по одному символу за раз
  • посчитайте этот символ: поскольку возможные символы (исключая Юникод) равны 256, вы можете иметь массив 256 int с и считать их там: таким образом вам не нужно будет искать правильный счетчик, а просто увеличивать правильный индекс.
...