посчитать вхождение символа в заданную строку, используя один для цикла с Java - PullRequest
0 голосов
/ 26 мая 2018

Это код ссылки:

    // Create an array of size 256 i.e. ASCII_SIZE
    int count[] = new int[MAX_CHAR];

    int len = str.length();

    // Initialize count array index
    for (int i = 0; i < len; i++)
        count[str.charAt(i)]++;

    // Create an array of given String size
    char ch[] = new char[str.length()];
    for (int i = 0; i < len; i++) {
        ch[i] = str.charAt(i);
        int find = 0;
        for (int j = 0; j <= i; j++) {

            // If any matches found
            if (str.charAt(i) == ch[j])
                find++;
        }

        if (find == 1)
            System.out.println("Number of Occurrence of " +
                    str.charAt(i) + " is:" + count[str.charAt(i)]);
    }

Выход должен выглядеть примерно так:

Число вхождений 'x' равно: 'количество раз, когда оно произошло'

Если буква встречалась ранее, отображать вхождение только один раз.


Я получаю логику, используя 2 для циклов, хотя мой учитель сказал, что можно выполнить это приложение, используя только1 для цикла.

проблема, с которой я сталкиваюсь:
Я могу найти, если персонаж уже найден, только если он находится рядом друг с другом.

Как вы ожидаете проверить, все ли предыдущие символы были найдены без другого цикла for?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Используйте Map<Integer, Integer> (ключ: символ, значение: количество символов) для хранения количества символов.

Вам нужно только один раз зациклить персонажей:

String input = "this is input string";
Map<Integer, Integer> charCount = new LinkedHashMap<>();
for (int c : input.toCharArray()) {
    if (!charCount.containsKey(c)) {
       charCount.put(c, 1);
    } else {
       charCount.put(c, charCount.get(c) + 1);
    }
}

// Here you print the char count:
for (Entry<Integer, Integer> entry : charCount.entrySet()) {
    // (char) entry.getKey() is the character
    // entry.getValue() is number of occurence
}

БезMap:

int[][] count = new int[MAX_CHAR][2];
for (int c : input.toCharArray()) {
    count[c][0] += 1; // Increase occurrence by 1
    count[c][1] = 1; // Mark this character exists in string
}
// Here you can print the count of char per character
// Not that, you can use count[c][1] to determine that if the character exists in your String
for (int i = 0; i < MAX_CHAR; i++) {
    if (count[i][1] == 1) {
        System.out.println("Char: " + (char) i + " Occurence: " + count[i][0]);
    }
}

Редактировать Как подсказывает @oreh, нам даже не нужны двухмерные массивы:

int[] count = new int[MAX_CHAR];
for (int c : input.toCharArray()) {
    count[c][0] += 1; // Increase occurrence by 1
}
for (int i = 0; i < MAX_CHAR; i++) {
    if (count[i] > 0) {
        System.out.println("Char: " + (char) i + " Occurence: " + count[i]);
    }
}
0 голосов
/ 26 мая 2018

Если вы хотите найти, например, только буквы, то вы знаете диапазон кодов ASCII.В этом случае достаточно использовать одномерный массив и представить индекс как код символа со смещением.Например, чтобы найти только буквы, вы можете создать массив int[] count = new int[26], а int total_a = count[0]; // or count['a' - 'a'] содержит счетчик для a, а для буквы z у нас есть последний индекс: int total_z = count[25]; // or count['z' - 'a']:

public static void printLetterOccurrence(String str) {
    int[] count = new int['z' - 'a' + 1];
    str = str.toLowerCase();

    for (int i = 0; i < str.length(); i++)
        if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z')
            count[str.charAt(i) - 'a']++;

    for (int i = 0; i < count.length; i++)
        if (count[i] > 0)
            System.out.println("Number of Occurrence of " + (char)('a' + i) + " is: " + count[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...