A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cat73 黑马帝   /  2014-8-24 10:48  /  4698 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
本帖最后由 cat73 于 2014-8-24 22:49 编辑

看到论坛多了个悬赏板块, 特地来支持下, 前几天遇到一个题- -
  1. 原题如下:
  2. 有一个不一定有多少条记录的数据库, 现在需要一个函数, 可以从这个数据库里随机取出一些记录
  3. 你只能使用一个很烂的数据库操作框架来完成这件事, 这个框架提供以下功能:
  4.   next():取出下一条记录
  5.   hasNext():判断是否还有下一条记录
  6.   当没有下一条记录的时候再执行next()会抛出异常, 并不能从头开始
  7. 整理下就是:有个不知道有多少数据的数据库要随机取出数据, 但是你只能顺序的一条一条的读这个数据库一次, 还得保证随机性
  8. PS.因为总数可能特别巨大, 因此全部读到内存里再随机的想法很不现实
复制代码

OK, 原题大概就是酱紫了, 耐心看完的亲们也看出来了, 这是一道算法题, 我用Java的ArrayList+Iterator模拟了一个这种数据库, 这道题我已经做出来了, 不过觉得很有意思, 于是就发到这里来了, 第一个完成的可以获得5个黑马币喵~~ 钱不多, 重在乐趣嘛~~
补全下面的代码, 使程序可以符合原题的要求(要写的代码在最下面):
  1. import java.util.*;

  2. /*以下代码是用Notepad++敲的, 比较懒就没扔进IDE里试试, 有问题的话见谅啦喵~~ 简单修正下就好- -*/
  3. class Test{
  4.         public static void run(){
  5.                 //定义数据库的数字数量
  6.                 final int total = 1000;
  7.                
  8.                 //将数字加入数据库(0~总数每个数字依次加入)
  9.                 ArrayList<Integer> at = new ArrayList<>(total); //这就是数据库啦喵~~ 别太较真啦~~
  10.                 for(int i = 0; i < total; i++){
  11.                         at.add(i);
  12.                 }
  13.                
  14.                 //调用getRandNum函数, 从数据库中随机取出100条记录
  15.                 ArrayList<Integer> result = getRandNum(at.iterator(), 100);
  16.                
  17.                 //输出这些记录
  18.                 Iterator<Integer> it = result.iterator();
  19.                 while(it.hasNext()){
  20.                         System.out.print(it.next() + "|");
  21.                 }
  22.         }
  23.         
  24.         /**
  25.          * 从不定长的数据库中随机取出一些记录并返回
  26.          * @param datas 数据库的迭代器
  27.          * @param count 要取出多少条记录
  28.          * @return 结果集
  29.          */
  30.         private static ArrayList<Integer> getRandNum(Iterator<Integer> datas, int count){
  31.                 final Random rand = new Random(); //准备随机数生成器
  32.                 final ArrayList<Integer> result = new ArrayList<>(count); //准备存储结果集的东东
  33.                
  34.                 //这里就是核心代码啦, 取随机的部分
  35.                 int id = 0;
  36.                 while(datas.hasNext()){
  37.                         Integer data = datas.next();
  38.                         id++;
  39.                         //就在这里写你的代码 你有以下几个东东可用:
  40.                         //data 这次取出的记录
  41.                         //rand 随机数生成器
  42.                         //result 存储结果用的东东
  43.                         //id 这是第几个记录
  44.                         
  45.                         System.out.println(id + "|" + data); //这条是演示下, 可以删的喵~~
  46.                                 //就在这里写代码!!!!!!!!!!
  47.                         
  48.                         //到这里为止
  49.                 }
  50.                
  51.                 return result;
  52.         }
  53. }
复制代码


做完可以试着改变下total的值看看是不是真的随机的
还有可以试着修改下这一行最后的数字ArrayList<Integer> result = getRandNum(at.iterator(), 100);

最佳答案

查看完整内容

无满意答案,但版主催着选满意答案,只能给小号了。 下面是版主原话

12 个回复

倒序浏览
无满意答案,但版主催着选满意答案,只能给小号了。
下面是版主原话
  1. 请尽快处理悬赏问题,选出最佳答案,如果没有处理,将会被屏蔽处理。谢谢配合~
复制代码
回复 使用道具 举报
刚刚试过了,不是随机的,是从零到999顺序输出的  另外这句话final Random rand = new Random(); 我怎么看着没用到呢
回复 使用道具 举报
cat73 黑马帝 2014-8-24 21:19:45
板凳
夜半风 发表于 2014-8-24 20:42
刚刚试过了,不是随机的,是从零到999顺序输出的  另外这句话final Random rand = new Random(); 我怎么看 ...

上面的代码是不完整的代码 是让回答者自己填写的喵~~
回复 使用道具 举报
完全看不懂  路过
回复 使用道具 举报
【如果不考虑重复随机和返回记录是否无序的情况的话,可以测试下下面的代码】
package com.hp.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import java.util.TreeSet;

class Test {
        public static void main(String[] args) {
                run();
        }
        public static void run() {
                final int total = 1500;
                ArrayList<String> at = new ArrayList<>(total);
                for (int i = 0; i < total; i++) {
                        at.add(i + "V ");
                }
                ArrayList<String> result = getRandNum(at.iterator(), 20, total);//和楼主的api有区别了。。。
                Iterator<String> it = result.iterator();
                while (it.hasNext()) {
                        System.out.print(it.next() + "|");
                }
        }

        private static ArrayList<String> getRandNum(Iterator<String> datas, int count, int total) {
                final ArrayList<String> result = new ArrayList<>(count);
                final Random rand = new Random();
                TreeSet<Integer> treeSet = new TreeSet<>();
                for (int i = 0; i < count; i++) {
                        treeSet.add(rand.nextInt(total));
                }
                while (treeSet.size() < count) {
                        while (count - (treeSet.size()) > 0) {
                                treeSet.add(rand.nextInt(total));
                        }
                }
                Iterator<Integer> it = treeSet.iterator();
                int[] arr = new int[count];
                int j = 0;
                while (it.hasNext()) {
                        arr[j] = it.next();
                        j++;
                }
                int currentDBIndex = 0;
                String currentDBValue = "";
                int currentArrayIndex = 0;
                int currentArrayValue = arr[currentArrayIndex];
                while (datas.hasNext()) {
                        currentDBValue = datas.next();
                        if (currentArrayValue == currentDBIndex) {
                                result.add(currentDBValue);
                                currentArrayIndex++;
                                if (currentArrayIndex < count) {
                                        currentArrayValue = arr[currentArrayIndex];
                                }
                        }
                        currentDBIndex++;
                }
                return result;
        }
}

评分

参与人数 1黑马币 +1 收起 理由
cat73 + 1 感谢支持喵~~

查看全部评分

回复 使用道具 举报
cat73 黑马帝 2014-8-24 22:44:57
7#
十万一千 发表于 2014-8-24 22:32
【如果不考虑重复随机和返回记录是否无序的情况的话,可以测试下下面的代码】
package com.hp.test;

说了框架很渣渣, 不能取总数的- -
回复 使用道具 举报
滔哥 黑马帝 2014-8-25 17:18:55
8#
这黑马币5个有点少!!
回复 使用道具 举报
让随机数来决定next()的次数不就OK了吗,反正本来就是伪随机嘛
回复 使用道具 举报
cat73 黑马帝 2014-10-12 16:27:49
10#
易孟飞 发表于 2014-10-3 04:30
让随机数来决定next()的次数不就OK了吗,反正本来就是伪随机嘛

无法保证每个元素出现的可能性一致
回复 使用道具 举报
cat73 发表于 2014-10-12 16:27
无法保证每个元素出现的可能性一致

能保证出现的可能性还叫随机吗?
回复 使用道具 举报
cat73 黑马帝 2014-10-13 13:10:03
12#
易孟飞 发表于 2014-10-13 10:29
能保证出现的可能性还叫随机吗?

10个元素的时候每个元素就要有10%的概率出现
1000个元素的时候每个元素就要有千分之一的概率出现
这才是随机
回复 使用道具 举报
有概率不一定出现啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马