5. topN 求前10个最大的数
程序员文章站
2024-03-15 22:22:06
...
date[2018-12-20]
准备材料
- 生成Long类型的包装数据流
Stream.generate(Math::random)
.mapToLong(v -> {
Double d = v * 1000000;
return d.longValue();
})
- 生成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] + " ");
}
}
上一篇: 在未排序的数组中找到第 k 个最大的元素
下一篇: JS之拖拽与碰撞检测