NC97 字符串出现次数的TopK问题
思路:
1、用TreeMap特性,放入时则自动把字符串按照字典序数据排序并存起来,统计字符串出现的次数。而HashMap做不到排序所以不用。然后我们按照value的值来排序,value相等则保持原来的字典序。
2、但是TreeMap底层红黑树本身就是按照key来组织排序的,根本不可能在本身上按照value来改变排序。所有类型的Map都是按照key来排序,若想按照value排序可以借助lisi。
3、所以我们需要借助ArrayList,把TreeMap放入list中,借助Collections.sort()定义按照value大的排序规则
package mid;
import java.util.*;
public class TopKStrings {
public static void main(String[] args) {
String [] strings = {"ab","ab","1b","1w","ew","1w","ab","ef"};
topKstrings(strings,3);
}
public static String[][] topKstrings (String[] strings, int k) {
// write code here
TreeMap<String,Integer> treeMap = new TreeMap<>();
for (String str:strings) {
if (!treeMap.containsKey(str)){
treeMap.put(str,1);
}else {
treeMap.put(str, treeMap.get(str) + 1);
}
}
//TreeMap本身不能通过value来改变排序,所以需要借助list,用Collections定义value排序规则
ArrayList<Map.Entry<String, Integer>> list = new ArrayList<>(treeMap.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue()-o1.getValue();
}
});
String[][] ans = new String[k][2];
for (int i = 0; i < k; i++) {
ans[i][0]=list.get(i).getKey();
ans[i][1]=list.get(i).getValue().toString();
}
return ans;
}
}