Top K 问题首先想到堆,这道题还好定制一个比较器 用 PriorityQueue 就可以了,不需要动态调整堆结构。所以不需要手写堆逻辑
哈哈偷了个懒,其实建议还是自己实现一个堆比较扎实能加深一下印象。

import java.util.*;


public class Solution {
    /**
     * return topK string
     * @param strings string字符串一维数组 strings
     * @param k int整型 the k
     * @return string字符串二维数组
     */
     public  String[][] topKstrings (String[] strings, int k) {
        // write code here

        PriorityQueue<MyNode> queue=new PriorityQueue<>(new MyComparator());

        HashMap<String,Integer> map=new HashMap<>(16);
        for (int i=0;i<strings.length;i++){
            if (map.containsKey(strings[i])){
                map.put(strings[i],map.get(strings[i])+1);
            }else {
                map.put(strings[i],1);
            }
        }
        //入堆
        for (Map.Entry<String,Integer> entry:map.entrySet()){
            queue.add(new MyNode(entry.getKey(),entry.getValue()));
        }
        String[][] result=new String[k][2];
        int j=0;
        while (j<k&&!queue.isEmpty()){
            MyNode node=queue.poll();
            result[j][0]=node.val;
            result[j++][1]= String.valueOf(node.num);
        }
        return result;

    }

    class MyNode{
        String val;
        int num;
        MyNode(String val,int num){
            this.num=num;
            this.val=val;
        }
    }

    class MyComparator implements Comparator<MyNode> {

        @Override
        public int compare(MyNode o1, MyNode o2) {
            if (o1.num==o2.num){
                //字典序小的在前 所以 o1 比 o2
                return o1.val.compareTo(o2.val);
            }else {
                //数量大的在前所以 o2 - o1
                return o2.num-o1.num;
            }

        }
    }
}