思路: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;
    }
 
}