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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 吴小铁你好 于 2012-7-10 09:21 编辑
  1. package com.day03;

  2. import java.util.Arrays;
  3. import java.util.HashSet;
  4. import java.util.Random;
  5. import java.util.Set;

  6. public class RandomTest {

  7.         /**
  8.          * 随机生成密码矩阵
  9.          */
  10.         public static void main(String[] args) {
  11.                 int k=0;
  12.                 Random r = new Random();
  13.                 Set<String> s = new HashSet<String>();
  14.               <FONT style="BACKGROUND-COLOR: red">  /*
  15.    * 需求:问题在下面,我想生成一个9*9的随机密码矩阵。
  16.    * 当我用for循环时,数组角标越界,用while时没问题。而当我把"i<81"变为"i<1000"时又可以输出
  17.    * 这个数组。
  18.    * 当我在for循环中加入System.out.println(s.size());时看机会大小,发现i<81时机会大小为60,i<100
  19.    * 集合大小为100.这是为什么呢???
  20.    *还有集合内存是怎样分配的啊,求解???
  21.    *
  22. </FONT>   * */
  23.                 for (int i = 0; i < 81; i++) {
  24.                         String str = "" + r.nextInt(10) + r.nextInt(10);
  25.                         s.add(str);
  26.                         //System.out.println(s.size());
  27.                 }
  28.                 /*while(s.size()<81){
  29.                         String str = "" + r.nextInt(10) + r.nextInt(10);
  30.                         s.add(str);
  31.                 }*/
  32.                 Object[] arr= s.toArray();
  33.                
  34.                 String [][]pass=new String[9][9];
  35.                 for(int x=0;x<9;x++){
  36.                         for(int y=0;y<9;y++){
  37.                                 pass[x][y]=(String) arr[k];
  38.                                 k++;
  39.                         }
  40.                 }
  41.                
  42.                 for(int i=0;i<pass.length;i++){
  43.                         System.out.println(Arrays.toString(pass[i]));
  44.                 }
  45.         }

  46. }


  47. /*
  48.    * 需求:问题在下面,我想生成一个9*9的随机密码矩阵。
  49.    * 当我用for循环时,数组角标越界,用while时没问题。而当我把"i<81"变为"i<1000"时又可以输出
  50.    * 这个数组。
  51.    * 当我在for循环中加入System.out.println(s.size());时看机会大小,发现i<81时机会大小为60,i<100
  52.    * 集合大小为100.这是为什么呢???
  53.    *还有集合内存是怎样分配的啊,求解???
  54.    *
  55.    * */
复制代码

1 个回复

正序浏览
Set集合每添加一个元素是会调用该元素的equals方法和集合中已存在的每个元素进行比较,如果equals()返回值为true,则Set集合认为改元素已存在,就不再添加该元素。
String str = "" + r.nextInt(10) + r.nextInt(10),随机生成str容易出现重复,重复时s.add(str)是无效的,所以会出现s<81是会出现size是60,每次添加元素前进行判断就可以了
                for (int i = 0; i < 81; i++) {
                        String str ;
                        do{
                            str = "" + r.nextInt(10) + r.nextInt(10);
                         }while(s.contains(str));
                        s.add(str);
                }
集合也是new产生的对象,所以集合也是存在堆元素中,集合中的元素都是地址值而不是实体对象

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1

查看全部评分

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