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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋浩 中级黑马   /  2012-6-8 12:30  /  1682 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.ArrayList;
import java.util.Random;
public class GetRandomList {

        public static void main(String[] args) {
         
                String[] brand = { "A","2","3","4","5","6","7","8","9","10","J","Q","K"} ;
                ArrayList al=new ArrayList();//用ArrayList集合来存储brand里面的元素
                for(int i=0;i<brand.length;i++){
                        al.add(brand);
                }
                Random rad =new Random(System.currentTimeMillis());//产生随机数
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }
}
洗牌的功能,有一个疑问,就是为什么在做第二个for循环的时候,如果将brand.length改成al.size()得到的
结果长度总会少几位,这两个值不是应该相等吗?很疑惑~!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 曹昌 于 2012-6-8 12:50 编辑

因为length和size()的针对性不同!

java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.

java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法.

java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!

import java.util.ArrayList;
import java.util.Random;
public class GetRandomList {

        public static void main(String[] args) {
         
                String[] brand = { "A","2","3","4","5","6","7","8","9","10","J","Q","K"} ;
                ArrayList al=new ArrayList();//用ArrayList集合来存储brand里面的元素
                for(int i=0;i<brand.length;i++){
                        al.add(brand);
                }
                Random rad =new Random(System.currentTimeMillis());//产生随机数
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }
}


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. for(int i=0;i<al.size();i++){  //i在自增,al的size在减小,所以这个循环会提前结束,不会有13次。
  2.                         int index=rad.nextInt(al.size()-i);
  3.                         randomArr.add(al.get(index));
  4.                         al.remove(index);//移除元素后,al的size会减一。
  5.                 }
复制代码
改后的代码:
  1. while(al.size()>0){//当al的size变为0时就表示13张牌都取完了。
  2.                 int index=al.size()>1?rad.nextInt(al.size()-1):0;//当al的size为1时,减一后为0,nextInt(n)中的n必须为正整数,所以这里判断了一下,al的size为1时,直接取索引为0
  3.                 randomArr.add(al.get(index));
  4.                 al.remove(index);
  5.         }
复制代码
回复 使用道具 举报
for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//这个语句是删除al中index位置的元素 避免了重复,
                                                 //当它删除元素后,它里面的元素个数会自动地减少,al.size()随着变化.而brand里面的元素个数是固定的,brand.length是不变的
                                                  
                }
回复 使用道具 举报
楼主给的代码有错呀,改正之后如下:
import java.util.ArrayList;
import java.util.Random;
public class GetRandomList {

        public static void main(String[] args) {
         
                String[] brand = { "A","2","3","4","5","6","7","8","9","10","J","Q","K"} ;
                ArrayList al=new ArrayList();//用ArrayList集合来存储brand里面的元素
                for(int i=0;i<brand.length;i++){
                        al.add(brand);//应该是al.add(brand);
                }
                Random rad =new Random(System.currentTimeMillis());//产生随机数
// 应该是:使用单个 long 种子创建一个新的随机数生成器
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }
}



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马