Сортировать по количеству появлений - PullRequest
0 голосов
/ 20 февраля 2020
Например,

, мне дано слово, и я должен отсортировать его буквы по количеству вхождений в этом слове, если две буквы появятся одинаковое количество раз, оно будет отсортировано по лексикографическому минимуму c. На данный момент я начал видеть, сколько раз буква появляется в слове, но отсюда я не знаю точно, как это сделать. Проблема требует, чтобы я использовал BufferedReader и BufferedWriter.

import java.util.*;

public class Main {
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    Map<Character, Integer> m = new HashMap<>();
    String s = sc.nextLine();
    for (int i = 0; i < s.length(); ++i) {
        char c = s.charAt(i);
        if (m.containsKey(c))
            m.put(c, m.get(c) + 1);
        else
            m.put(c, 1);
    }
    for (char letter = 'a'; letter <= 'z'; ++letter)
        if (m.containsKey(letter))
            System.out.println(letter + ": " + m.get(letter));
}

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

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Надеюсь, это то, что вы хотите

public static void main(String[] args) {
    Map<Character, Integer> m = new HashMap<>();
    String testString = "Instructions";
    Map<Character, List<Character>> map = new HashMap<>();

    for (int i = 0; i < testString.length(); i++) {
        char someChar = testString.charAt(i);
        if (someChar == ' ') {
            continue;
        }
        char ch = testString.charAt(i);
        List<Character> characters = map.getOrDefault(Character.toLowerCase(ch), new ArrayList<>());
        characters.add(ch);
        map.put(Character.toLowerCase(ch), characters);
    }
    List<Map.Entry<Character, List<Character>>> list = new ArrayList<>(map.entrySet());

    list.sort((o1, o2) -> {
        if (o1.getValue().size() == o2.getValue().size()) {
            return o1.getKey() - o2.getKey();/// your lexicographic comparing
        }
        return o2.getValue().size() - o1.getValue().size();
    });

    list.forEach(entry -> entry.getValue().forEach(System.out::print));
}
0 голосов
/ 20 февраля 2020

Для подсчета букв в слове вы можете использовать гораздо более простой метод:

определить массив с 26 нулями, отсканировать входную строку и увеличить соответствующий индекс в этом массиве, так что если вы встречаете 'a' (или 'A '- это та же буква, но другой символ) - вы увеличите значение с индексом 0, b - с индексом 1 и т. д. c

, во время этого сканирования вы также можете вычислить наиболее часто встречающийся символ, например:

public static void main(final String[] args) throws IOException {
    char maxSymbol = 0;
    int maxCount = 0;

    final int[] counts = new int[26]; // number of times each letter (a-z) appears in string
    try (final BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
        final String s = br.readLine().toLowerCase(); // calculate case-insensitive counts
        for (final char c : s.toCharArray()) {
            final int idx = c - 'a'; // convert form ASCII code to 0-based index
            counts[idx]++;

            if (counts[idx] > maxCount) {
                maxSymbol = c; // we found most occurred symbol for the current moment
                maxCount = counts[idx];
            } else if (counts[idx] == maxCount) { // we found 2nd most occurred symbol for the current moment, need to check which one is minimal in lexicographical order
                if (c < maxSymbol) {
                    maxSymbol = c;
                }
            }
        }
    }

    if (maxSymbol > 0) {
        System.out.println("Most frequent symbol " + maxSymbol + " occurred " + maxCount);
    }
}

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

...