首页 > 其他分享 >Map根据value排序取topN

Map根据value排序取topN

时间:2023-10-09 14:25:40浏览次数:42  
标签:map String Map value getValue topN Entry


public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
       /* for (int i = 0; i < 1000000; i++) {
            int nextInt = new Random().nextInt();
            map.put("A" + i, i * nextInt);
        }*/
        map.put("A", 10);
        map.put("B", 5);
        map.put("C", 8);
        map.put("D", 3);
        map.put("E", 12);

        long start = System.currentTimeMillis();
        String top2;
        // top2 = sorted(map);
        //top2 = queue(map);
        top2 = queue(map);

        System.out.println(top2 + " 共计耗时:" + (System.currentTimeMillis() - start) + "ms");

    }

    private static String sorted(Map<String, Integer> map) {
        int limit = 2;
        // 将规格按照value值倒序排序,并取前N位
        Map<String, Integer> topN = map.entrySet().stream().sorted(Entry.<String, Integer>comparingByValue().reversed()).limit(limit)
                .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));
        String monthTop2Specs = topN.keySet().stream().collect(Collectors.joining(","));
        return monthTop2Specs;
        //1000000数据 A665318,A344427 共计耗时:947ms
    }

    private static String queue(Map<String, Integer> map) {
        PriorityQueue<Entry<String, Integer>> pq = new PriorityQueue<>(Comparator.comparingInt(Entry::getValue));
        for (Entry<String, Integer> entry : map.entrySet()) {
            pq.offer(entry);
            if (pq.size() > 2) {
                pq.poll();
            }
        }
        List<Entry<String, Integer>> result = new ArrayList<>(pq);
        result.sort((a, b) -> b.getValue() - a.getValue());
        String top2 = result.stream().map(v -> v.getKey()).collect(Collectors.joining(","));
        return top2;
        //1000000数据 A923550,A225834 共计耗时:137ms
    }

private static String sort2(Map<String, Integer> map) {
        int limit = 2;
        List<Entry<String, Integer>> topN = new ArrayList<>();
        for (Entry<String, Integer> entry : map.entrySet()) {
            if (topN.size() < limit) {
                topN.add(entry);
            } else {
                int minIndex = 0;
                for (int i = 1; i < limit; i++) {
                    if (topN.get(i).getValue() < topN.get(minIndex).getValue()) {
                        minIndex = i;
                    }
                }
                if (entry.getValue() > topN.get(minIndex).getValue()) {
                    topN.set(minIndex, entry);
                }
            }
        }
        topN.sort((a, b) -> b.getValue() - a.getValue());
        String monthTop2Specs = topN.stream().map(Entry::getKey).collect(Collectors.joining(","));
        return monthTop2Specs;
        //1000000数据 A340689,A630248 共计耗时:110ms
    }

标签:map,String,Map,value,getValue,topN,Entry
From: https://www.cnblogs.com/SimonHu1993/p/17751597.html

相关文章

  • MDC (Mapped Diagnostic Context)
    MDC是org.slf4j包下的一个类,它的全称是MappedDiagnosticContext,我们可以认为它是一个线程安全的存放诊断日志的容器。MDC的底层是用了ThreadLocal来保存数据的。我们可以用它传递参数。例如现在有这样一种场景:我们使用RestTemplate调用远程接口时,有时需要在header中传递信息,......
  • JAVA中使用map如何不改变原来顺序
    原文链接:https://www.longkui.site/program/java/java%e4%b8%ad%e4%bd%bf%e7%94%a8map%e5%a6%82%e4%bd%95%e4%b8%8d%e6%94%b9%e5%8f%98%e5%8e%9f%e6%9d%a5%e9%a1%ba%e5%ba%8f/4793/0.背景后台返回数据的时候,发现根据数据库预定义好的字段排序被改变了,于是顺着代码逻辑找下去,发现......
  • SQLSugar中Includes和Mapper的区别
    在SQLSugar中,Include和Mapper确实在处理过滤器方面有一些不同的行为。Include方法:当你使用Include方法来加载关联实体时,SQLSugar会忽略过滤器,不会将过滤器应用于加载的关联实体。这意味着无论你是否定义了过滤器,使用Include方法加载的关联实体都会被加载,而不受过滤器的影响。......
  • (unordered_)set,(unordered_)map,数组(vector)
    set:保证元素的唯一性,并且元素从小到大排序unordered_set:保证元素的唯一性,并且元素的顺序未知,不一定和输入相同map:键从小到大排序unordered_map:键的顺序未知,不一定和输入相同数组(vector):元素的顺序和输入相同......
  • Go - Remove values from a slice
    Totakeoutthefirstelementoftheslice:numbers:=[]int{3,14,159,26,53,58}numbers=numbers[1:]//removeelement0To takeoutthelastelementoftheslice:numbers:=[]int{3,14,159,2......
  • Go - Insert values into a slice
    Thereisnobuilt-infunctionforinsertion,butyoucanstilluseappendforthetask.Let’ssayyouwanttoinsertthenumber1000betweenelementsatindex2and3,whichareints159and26,respectively:numbers:=[]int{3,14,159,......
  • value date
    起息日或生效日,一般指銀行之間或銀行和支付公司之間資金實際交割清算的日子。比如某客户在7月29日办理了一笔汇款,但注明了起息日为7月31日,也就是说银行之间要在7月31日才实际交割清算资金,收款人账户也最早会在7月31日收到资金。......
  • CountDownLatch、CyclicBarrier、Semaphore面试讲解
    @TOC<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">这三个也是面试常问的,作为线程通信的方法1.CountDownLatch(CDL)主要是用于一个线程等待其他完成后才继续执行。主要方法:await()、countDown()CountDownLatchcdl=newCountDownLatch(2);//第一......
  • 【大数据】MapReduce与YARN 介绍与配置
    MapReduce架构MapReduce是一种分布式计算模型,用于处理大规模数据集。它将数据分成小块,分配给集群中的节点进行处理。Map阶段处理数据并生成键值对,Shuffle阶段将相同键的值对传输到同一节点进行排序和分组,Reduce阶段对每组键值对执行操作并生成结果。整个过程由Master节点协......
  • [已解决] Compilation error ptxas fatal : Value ‘sm_30‘ is not defined for opti
    在用cmake编译cuda程序时,总是报Compilationerrorptxasfatal:Value‘sm_30’isnotdefinedforoption‘gpu-name’问题,也是折腾了好久,感谢这位小哥的解决方案,亲试无误,万分感谢~转载:https://blog.csdn.net/Fucking_Code0916/article/details/132429186安装tiny-cudann出......