本帖最后由 创造命运 于 2014-4-7 08:47 编辑
以下是昨天晚上在看完随机数类型后碰到的一道题目:创建5个[0,100]之间不重复的整型随机数
一、使用数组来完成,源代码如下:
一开始,我没有想到定义一个计数器来记录产生随机数0的次数,代码如下:
for (int i = 0; i < random.length; i++)
{
int a = r.nextInt(101);
if ( a != random【i】 )
{
random【i】 = a;
}
…………
}
后来想到随机数0似乎不可能被保存到数组中,所以做了一些修改。如下:
import java.util.*;
public class RandomTest
{
static int count = 0; //计数器,用来记录产生随机数0的次数
public static void main(String[] args)
{
//创建一个数组
int[] random = new int[5];
//创建一个随机数生成器
Random r = new Random();
for (int i = 0; i < random.length; i++)
{
//生成[0,100]之间的随机数
int a = r.nextInt(101);
//如果是第一次产生随机数0,那么就将0保存到数组random中
if (0 == a)
{
count++;
if (1 == count)
{
random【i】 = 0;
continue;
}
}
//如果产生的随机数在数组random中不存在,则将该随机数保存到数组中
/*
int[] random = new int[5];java中random[5]数组的每个元素的缺省值都是0,即{0,0,0,0,0}
问题:假设前两个产生的随机数都不是0,比如{85,3,0,0,0},如果产生的第三个随机数是0,
但是在数组random中次时已经有了数字0,这样的话“0”这个随机数就不能保存到数组random中。
也就是说在产生的5个不同的随机数里不可能有0。
所以在前面定义了一个count静态变量,用来记录产生随机数0的次数,如果是第一次产生
随机数0,那么就将0保存到数组random中。
*/
if ( a != random【i】)
{
random【i】 = a;
}
}
for (int i = 0; i < random.length; i++)
{
System.out.println( random【i】);
}
}
}
通过这个程序,我还知道了,静态变量不能再方法中定义。
二、之前我将集合看过一些,所以想着试试用集合看能不能完成。但是结果却是不理想,代码如下:
//使用ArrayList集合来完成
import java.util.*;
public class RandomTest
{
public static void main(String[] args)
{
//创建集合对象
ArrayList c = new ArrayList();
//创建一个随机数生成器
Random r = new Random();
//获取迭代器对象
Iterator it = c.iterator();
while(c.size() < 5)
{
int i = r.nextInt(101);
if (c.isEmpty())
{
c.add(i); //自动装箱
continue;
}
/*
// Iterator 在工作的时候是不允许被迭代的对象被改变的,所以运行时报异常:ConcurrentModificationException。
while(it.hasNext())
{
Integer a = (Integer)it.next();
if (!Integer.valueOf(i).equals(a))
{
c.add(i);
}
}
*/
int longth = c.size();
for (int j = 0; j < longth; j++)
{
Integer a = (Integer)c.get(j); //if里面的表达式为什么写成 !i.equals(a)后就会报异常:无法取消引用呢?
if (!Integer.valueOf(i).equals(a))
{
c.add(i);
}
}
}
while (it.hasNext())
{
System.out.println(it.next());
}
}
}
这个程序编译可以通过,但是会报警:注意:RandomTest.java 使用了未经检查或不安全的操作. 注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。在编译时加上-Xlint:unchecked,提示如下两个警告:
在运行时,出现异常:java.util.ConcurrentModificationException。在网上查了一下,看到这样一段话:Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以我不用while循环跟iterator,采用for循环试试,结果还是报该异常。我想到,在我c.add(i)的时候,c.size()的结果也在改变,所以出错。请教各位,这个问题该怎么解决。
|