思路:Map记录字符串出现的次数,然后进行排序,最后截取前K个数据即可。
public class Solution {
public String[][] topKstrings (String[] strings, int k) {
Map<String,Integer> map = new HashMap<>();
for(String s:strings){
if(map.containsKey(s))map.put(s,map.get(s)+1);
else map.put(s,1);
}
String[][] list = new String[map.size()][2];
int i = 0;
for (String key : map.keySet()) {
list[i][0] = key;//[0]存放字符串
list[i][1] = map.get(key)+"";//[1]存放出现的次数
i++;
}
Arrays.sort(list,new Comparator<String[]>(){
public int compare(String[] s1,String[]s2){
if(s1[1].equals(s2[1])){//出现次数相同则比较字符串的字典序
return s1[0].compareTo(s2[0]);//为什么这里是s1在前面,下面一行是s2在前面?
//这就要提到这个compare函数的返回值了,如果返回的是大于零的数,则两个元素在数组中会进行交换,否则不交换。
//此处,字符串出现的次数相同,字典序小的应该在前面,因此,如果s1大于s2(即s1[0].compareTo(s2[0])的值大于零),说明应该交换。
}else return Integer.parseInt(s2[1]) - Integer.parseInt(s1[1]);
//2-1降序 1-2升序,这里采用的是降序
}
});
String[][]res = Arrays.copyOfRange(list,0,k);
return res;
}
}