如何按频率对可以使用Java 7的字符进行排序?
我需要打印单词中出现的所有字母,重新排列,以便在开头找到出现频率最高的字母 如果有相同次数的字母出现,则按字母顺序排序后,将首先显示最小的字母 我尝试了一些东西,但是我的输出超过了极限 如何使用BufferedWriter使此解决方案运行得更快?我应该使用HashMap吗 输入:指令 输出:iinnssttcoru如何按频率对可以使用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
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);
}