欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

5. topN 求前10个最大的数

程序员文章站 2024-03-15 22:22:06
...

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] + " ");
        }
    }