首页 > 解决方案 > 如何根据与 Java 7 兼容的出现顺序对单词的字母进行排序?

问题描述

我需要打印单词中出现的所有字母,重新排列以便在开头找到最常出现的字母。

单词最多可包含 100,000 个字符。

如果存在出现次数相同的字母,则按字母排序后,将首先显示最小的字母。

Java 中的一些类和操作很慢。为此,建议使用 BufferedReader 和 BufferedWriter。

使用 String 连接很慢。

输入:指令

输出:innssttcour

public class Main {
public static void main(String[] args) throws IOException {
 String line;
 BufferedReader reader = new BufferedReader(new 
 InputStreamReader(System.in));
 line = reader.readLine();

     StringBuilder sb = new StringBuilder();
     Map<Character, Integer> charCountMap = new HashMap<>();

     int len = line.length();

      for(int i = 0; i < len; i++) {
           char ch = line.charAt(i);
           charCountMap.put(ch, charCountMap.getOrDefault(ch, 0) + 1);
      }

      charCountMap.entrySet().stream()
                  .sorted(Map.Entry.<Character, 
     Integer>comparingByValue().reversed())
                 .forEach(record -> {
                    Character key = record.getKey();
                    int value = record.getValue();

                    for(int i = 0; i < value; i++) {
                          sb.append(key);
                     }
        });

        sb.toString();
        System.out.println(sb);
     }
  }

我的第二个解决方案工作太慢。

public class Main {
public static void main(String[] args) throws IOException {
String inputString;
BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));
inputString = reader.readLine();
if(reader != null)
 reader.close();
    int[] letterArray = new int[26];
    char[] letters = new char[26];
    for(int i=0;i<=25;i++)
        letters[i] = (char)(97+i);
    for(int i=0; i< inputString.length(); i++)
        letterArray[inputString.charAt(i) - 97] +=1 ;
    for(int i=0; i<=24;i++)
        for(int j=i+1;j<=25;j++){
            if(letterArray[i] <letterArray[j] || (letterArray[i] == 
               letterArray[j] && letters[i] > letters[j])){
                int temp = letterArray[i];
                letterArray[i] = letterArray[j];
                letterArray[j] = temp;
                char temp2;
                temp2 = letters[i];
                letters[i] = letters[j];
                letters[j] = temp2;}
        }
      String outputString = new String();
        for(int i=0;i<=25;i++){
            for(int j = 0; j<letterArray[i]; j++)
                outputString += letters[i];}
     System.out.println(outputString);}
     }

标签: javastringsortingoop

解决方案


你快到了。需要按反转的值对 Map 进行排序,然后按键排序。


推荐阅读