Проблемы с сортировкой символов слова - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть проблема, с которой я боролся в течение некоторого времени. Мне дано слово, состоящее из маленьких или больших букв алфавита Engli sh, для сортировки символов так, чтобы в первых позициях появлялись символы, которые чаще всего встречаются в слове, и если они появляются одинаковое количество раз Будут отсортированы лексикографические. Например:

ввод: инструкции

вывод: iinnssttcoru

Пока я написал это, но отсюда я не знаю, как сортировать их и правильно отображать, совет?

public class Main {
public static void main(String[] args) throws IOException {
    String testString = " ";
    BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
    testString = rd.readLine();
    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());}

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Вот мое решение:

import java.util.*;

public class Test
{
    static void process(String s)
    {
        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        for(Character c : s.toLowerCase().toCharArray())
        {
            Integer nb = map.get(c);
            map.put(c, nb==null ? 1 : nb+1);
        }

        ArrayList<Map.Entry<Character,Integer>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, (a,b) ->
        {
            int res = b.getValue().compareTo(a.getValue());
            if(res!=0)
                return res;
            return a.getKey().compareTo(b.getKey());
        });

        for(Map.Entry<Character,Integer> e : list)
        {
            for(int i=0;i<e.getValue();i++)
                System.out.print(e.getKey());
        }
    }

    public static void main(String[] args)
    {
        process("Instructions");
    }
}
0 голосов
/ 29 февраля 2020

Вы можете добавить TreeMap counterAppear, указав key - количество повторений символа и значение в списке символов с таким же количеством key повторений. Этот список должен быть отсортирован перед печатью, чтобы обеспечить порядок в соответствии с требованиями. Используйте TreeMap, чтобы убедиться, что карта отсортирована по ключу (количество повторений).

public static void main(String[] args) throws IOException {
        String testString = " ";
        BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
        testString = rd.readLine();
        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);
            //Change to Optimize Code
            Character keyCharacter = Character.toLowerCase(ch);
            if (map.get(keyCharacter) == null) {
                map.put(keyCharacter, new ArrayList<>());
            }
            List<Character> characters = map.get(keyCharacter);
            characters.add(ch);
        }
        TreeMap<Integer, List<Character>> counterAppear = new TreeMap<>();
        for (Map.Entry<Character, List<Character>> entry : map.entrySet()) {
            Character character = entry.getKey();
            int repeatCharTime = entry.getValue().size();
            if (counterAppear.get(repeatCharTime) == null) {
                counterAppear.put(repeatCharTime, new ArrayList<>());
            }
            List<Character> characters = counterAppear.get(repeatCharTime);
            characters.add(character);
        }

        for (Integer repeatCharTime : counterAppear.descendingKeySet()) {
            List<Character> keyCharacters = counterAppear.get(repeatCharTime);
            Collections.sort(keyCharacters);
            for (Character character : keyCharacters) {
                for (int i = 0; i < repeatCharTime; i++) {
                    System.err.print(character);
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...