题目要求
将一个字符串中字符按出现频率的高到低排序返回,如果两个字符出现的频率一样,则将最先出现的字符排在前面
例如:
- orderChar(“abcdefg”)返回 “abcdefg”
- orderChar(“abcdefgg”)返回 “gabcdef”
- orderChar(“abcdefgge”)返回 “egabcdf”
解题代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* 把你作业的代码写到这个类里面
* 不可以修改类的名字、包名、和固有的几个方法名以及方法的可见性
* 可以增加其他方法、属性、类
* 可以引用jdk的类
* 不要引用jdk1.8以外第三方的包
*
* @author ly
*
*/
public class H {
public H() {
}
/**
* 将一个字符串中字符按出现频率的高到低排序返回,如果两个字符出现的频率一样,则将最先出现的字符排在前面
* 例如:orderChar(“abcdefg”)返回 “abcdefg”
* orderChar(“abcdefgg”)返回 “gabcdef”
* orderChar(“abcdefgge”)返回 “egabcdf”
* @param content
* @return
*/
public String orderChar(String content) {
// 如果为空则返回空值
StringBuffer ret= new StringBuffer();
if(content.length()<=0){
return ret.toString();
}
/*用于存储各个字符出现的频率
* 此处一定要用LinkedHashMap,否则输出输出顺序将被打乱
*/
Map<Character,Integer> map = new LinkedHashMap<Character,Integer>();
for (int i=0;i<content.length();i++){
map.put(content.charAt(i), map.getOrDefault(content.charAt(i), 0)+1);
}
/*
* map 根据value值排序
*/
List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
Collections.sort(list,new Comparator<Entry<Character,Integer>>(){
@Override
public int compare(Entry<Character,Integer> arg0,Entry<Character,Integer> arg1){
return arg1.getValue()-arg0.getValue();
}
});
for(Entry<Character,Integer> item:list){
int count = item.getValue();
char key = item.getKey();
ret.append(key);
}
return ret.toString();
}
}
测试代码
public class Test {
public Test() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
H h = new H();
if (h.orderChar("abcdefgg").equals("gabcdef")) {
// test case 1 ok
System.out.println("ok1");
}
if (h.orderChar("abcdefgge").equals("egabcdf")) {
// test case 2 ok
System.out.println("ok2");
}
}
}