如何按频率对可以使用Java 7的字符进行排序?

如何按频率对可以使用Java 7的字符进行排序?,java,string,algorithm,sorting,oop,Java,String,Algorithm,Sorting,Oop,我需要打印单词中出现的所有字母,重新排列,以便在开头找到出现频率最高的字母 如果有相同次数的字母出现,则按字母顺序排序后,将首先显示最小的字母 我尝试了一些东西,但是我的输出超过了极限 如何使用BufferedWriter使此解决方案运行得更快?我应该使用HashMap吗 输入:指令 输出:iinnssttcoru public class Main { public static void main(String[] args) throws IOException { String inpu

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

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

我尝试了一些东西,但是我的输出超过了极限

如何使用BufferedWriter使此解决方案运行得更快?我应该使用HashMap吗

输入:指令

输出:iinnssttcoru

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);}
  }
公共类主{
公共静态void main(字符串[]args)引发IOException{
字符串输入字符串;
BufferedReader读取器=新的BufferedReader(新的
InputStreamReader(System.in));
inputString=reader.readLine();
if(读卡器!=null)
reader.close();
int[]letterArray=新int[26];
字符[]个字母=新字符[26];

对于(int i=0;i您可以实现一个包装器类,实现
Comparable
接口:

class CharFreq implements Comparable<CharFreq>{

    final char c;
    int f = 0;

    CharFreq(char cc) {this.c = cc;}

    @Override
    public int compareTo(CharFreq that) {
        return this.f == that.f ? this.c - that.c : that.f - this.f;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        int ff = f;
        while (ff-- > 0) sb.append(c);
        return sb.toString();
    }
}
输出

iinnssttcoru
也可以在不显式调用集合的情况下使用排序集。排序

String s = "instructions";
Map<Character, CharFreq> map = new HashMap<>();
for (char c : s.toCharArray()) {
    if (map.get(c) == null) {
        map.put(c, new CharFreq(c));
    }
    CharFreq cf = map.get(c);
    cf.f++;
}

List<CharFreq> list = new ArrayList<>(map.values());
Collections.sort(list);

for (CharFreq cf : list) {
    System.out.print(cf);
}
Set<CharFreq> sorted = new TreeSet<>(map.values());
for (CharFreq cf : sorted) {
    System.out.print(cf);
}
Set sorted=新树集(map.values());
for(CharFreq cf:sorted){
系统输出打印(cf);
}

HashMap
是这个问题最明显的解决方案
BufferedReader
用于输入/输出,我不知道它如何帮助您加快算法的速度。@Home是CIS或
Map
的所在,您希望从补充平面(例如表情)支持Unicode码点。@GeorgeChetan哪个部分正在停止ou?构建字符频率的
映射
,或按频率对映射条目进行排序?另请注意:阅读正确的Java代码缩进。您应该将{在一行的末尾用大括号括起来,并且始终使用相同的缩进。这类事情很重要。它们使您的代码易于阅读或难以阅读。This
返回This.f==This.f?This.c-This.c:This.f-This.f;
是一个可怕的习惯。最好花点时间,适当地返回-1、1或0。以免没有经验的人会采用这种方法,并最终陷入麻烦。在这种减去两个字符或两个非负整数的特定情况下,可能会出现什么样的麻烦?在
String::compareTo
方法的和实现中使用了类似的方法。在这种情况下,没有。无论在什么情况下使用,这仍然被认为是一种不好的做法JDK。
Set<CharFreq> sorted = new TreeSet<>(map.values());
for (CharFreq cf : sorted) {
    System.out.print(cf);
}