美文网首页bigdata
5. topN 求前10个最大的数

5. topN 求前10个最大的数

作者: 百炼 | 来源:发表于2018-12-20 21:31 被阅读0次

    date[2018-12-20]

    准备材料

    1. 生成Long类型的包装数据流
    Stream.generate(Math::random)
                  .mapToLong(v -> {
                        Double d = v * 1000000;
                        return d.longValue();
                    })
    
    1. 生成Int类型的非包装数据流
    Random random = new Random(System.currentTimeMillis());
    IntStream.generate(() -> random.nextInt(100000))
    

    求前10个最大的数

    生成100不包含重复的个Long类型的数据,排序然后求取前10个

       @Test
        public void test() {
            Stream.generate(Math::random)
                    .mapToLong(v -> {
                        Double d = v * 1000000;
                        return d.longValue();
                    })
                    .distinct()
                    .limit(100)
                    .sorted()
                    .limit(10)
                    .forEach(System.out::println);
        }
    

    SortedMap通过移除lastKey,firstKey实现不同的需求

    使用SortedMap求最大的10个数

       /**
         * 求最大的10个数
         */
        @Test
        public void testTopN() {
            TreeMap<Long, String> top10Map = new TreeMap<>();
            long[] longArrs = Stream.generate(Math::random)
                    .mapToLong(v -> {
                        Double d = v * 1000000;
                        return d.longValue();
                    })
                    .limit(1000)
                    .toArray();
    
    
            Arrays.stream(longArrs).forEach(v -> {
                top10Map.put(v, "v:" + v);
                if (top10Map.size() > 10) {
                    top10Map.remove(top10Map.firstKey());
                }
            });
    
            top10Map.forEach((k, v) -> {
                System.out.println(k + ":" + v);
            });
            System.out.println("===================================");
            Arrays.sort(longArrs);
            for (int i = 990; i < 1000; i++) {
                System.out.println(longArrs[i] + " ");
            }
        }
    

    使用SortedMap求最小的10个数

        /**
         * 求最小的10个数
         */
        @Test
        public void testLowN() {
            TreeMap<Long, String> low10Map = new TreeMap<>();
            long[] longArrs = Stream.generate(Math::random)
                    .mapToLong(v -> {
                        Double d = v * 1000000;
                        return d.longValue();
                    })
                    .limit(1000)
                    .toArray();
    
    
            Arrays.stream(longArrs).forEach(v -> {
                low10Map.put(v, "v:" + v);
                if (low10Map.size() > 10) {
                    low10Map.remove(low10Map.lastKey());
                }
            });
    
            low10Map.forEach((k, v) -> {
                System.out.println(k + ":" + v);
            });
            System.out.println("===================================");
            Arrays.sort(longArrs);
            for (int i = 0; i < 10; i++) {
                System.out.println(longArrs[i] + " ");
            }
        }
    

    相关文章

      网友评论

        本文标题:5. topN 求前10个最大的数

        本文链接:https://www.haomeiwen.com/subject/mowukqtx.html