本帖最后由 cat73 于 2014-8-24 22:49 编辑
看到论坛多了个悬赏板块, 特地来支持下, 前几天遇到一个题- -
- 原题如下:
- 有一个不一定有多少条记录的数据库, 现在需要一个函数, 可以从这个数据库里随机取出一些记录
- 你只能使用一个很烂的数据库操作框架来完成这件事, 这个框架提供以下功能:
- next():取出下一条记录
- hasNext():判断是否还有下一条记录
- 当没有下一条记录的时候再执行next()会抛出异常, 并不能从头开始
- 整理下就是:有个不知道有多少数据的数据库要随机取出数据, 但是你只能顺序的一条一条的读这个数据库一次, 还得保证随机性
- PS.因为总数可能特别巨大, 因此全部读到内存里再随机的想法很不现实
复制代码
OK, 原题大概就是酱紫了, 耐心看完的亲们也看出来了, 这是一道算法题, 我用Java的ArrayList+Iterator模拟了一个这种数据库, 这道题我已经做出来了, 不过觉得很有意思, 于是就发到这里来了, 第一个完成的可以获得5个黑马币喵~~ 钱不多, 重在乐趣嘛~~
补全下面的代码, 使程序可以符合原题的要求(要写的代码在最下面):
- import java.util.*;
- /*以下代码是用Notepad++敲的, 比较懒就没扔进IDE里试试, 有问题的话见谅啦喵~~ 简单修正下就好- -*/
- class Test{
- public static void run(){
- //定义数据库的数字数量
- final int total = 1000;
-
- //将数字加入数据库(0~总数每个数字依次加入)
- ArrayList<Integer> at = new ArrayList<>(total); //这就是数据库啦喵~~ 别太较真啦~~
- for(int i = 0; i < total; i++){
- at.add(i);
- }
-
- //调用getRandNum函数, 从数据库中随机取出100条记录
- ArrayList<Integer> result = getRandNum(at.iterator(), 100);
-
- //输出这些记录
- Iterator<Integer> it = result.iterator();
- while(it.hasNext()){
- System.out.print(it.next() + "|");
- }
- }
-
- /**
- * 从不定长的数据库中随机取出一些记录并返回
- * @param datas 数据库的迭代器
- * @param count 要取出多少条记录
- * @return 结果集
- */
- private static ArrayList<Integer> getRandNum(Iterator<Integer> datas, int count){
- final Random rand = new Random(); //准备随机数生成器
- final ArrayList<Integer> result = new ArrayList<>(count); //准备存储结果集的东东
-
- //这里就是核心代码啦, 取随机的部分
- int id = 0;
- while(datas.hasNext()){
- Integer data = datas.next();
- id++;
- //就在这里写你的代码 你有以下几个东东可用:
- //data 这次取出的记录
- //rand 随机数生成器
- //result 存储结果用的东东
- //id 这是第几个记录
-
- System.out.println(id + "|" + data); //这条是演示下, 可以删的喵~~
- //就在这里写代码!!!!!!!!!!
-
- //到这里为止
- }
-
- return result;
- }
- }
复制代码
做完可以试着改变下total的值看看是不是真的随机的
还有可以试着修改下这一行最后的数字ArrayList<Integer> result = getRandNum(at.iterator(), 100); |