题目描述
如果统计的个数相同,则按照ASCII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
输入描述:
输入一串字符。
输出描述:
对字符中的
各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
示例1
输入
aadddccddc
输出
dca
思路:先判断是否为三种类型
遍历每个字符,已存在则统计次数;不存在则加入字典
排序,先按字符ASCII码,再按次数
while True:
try:
str=input().strip()
strdict={}
for eachstr in str:
if eachstr.isdigit() or eachstr.isalpha() or eachstr==" ":
if eachstr in strdict.keys():
strdict[eachstr]+=1
else:
strdict[eachstr]=1
sortlist=sorted(sorted(strdict.items(),key=lambda x:x[0]),key=lambda x:x[1],reverse=True)#返回一个tuple类型
for i in sortlist:
print(i[0],end='')
print('')
except:
break
JAVA
利用Treemap
利用Collections.sort()对list排序,要将将map集合中的映射关系取出,存入到list集合中
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext())
{
String strline=in.nextLine();
//建立字典统计字符和次数
TreeMap<Character,Integer> tm=new TreeMap<>();
for (int i=0;i<strline.length();i++){
char ch=strline.charAt(i);
if ((ch>='A' && ch<='Z')||(ch>='a' && ch<='z')||(ch>='0' && ch<='9')||ch==' '){
if (tm.containsKey(ch))
tm.put(ch,tm.get(ch)+1);
else
tm.put(ch,1);
}
}
//排序,Collections.sort()对list排序默认ASCII顺序
List<Map.Entry<Character,Integer>> ls=new ArrayList<>(tm.entrySet());//map映射取出生成list
Collections.sort(ls,new Comparator <Map.Entry<Character,Integer>>(){ //重写compare
public int compare(Map.Entry<Character,Integer> o1,Map.Entry<Character,Integer> o2){
return o2.getValue()-o1.getValue();//逆序 return值>0,则互换位置,实现逆序
}
});
for(Map.Entry<Character,Integer> m:ls){ //高级for循环,遍历集合or数组
System.out.print(m.getKey());
}
System.out.println();
}
}
}
比较器的使用
Comparator 的使用有两种方式:
Collections.sort(list,Comparator);
list.sort(Comparator);
https://blog.youkuaiyun.com/qq_23179075/article/details/78753136