写在前面:本人也是Java菜鸟与初学者,如有不当烦请指正
在昨天的作业中一个步骤需要从一个巨大的数组[Array]中随机抽取元素,而且不能重复。众所周知数组一旦创建大小就不能改变,因此我们需要将数组转化为列表[List]以便操作。转化思路(之一)如下:
1
| List<String> tempList = new ArrayList<>(Arrays.asList(driverNameList));
|
其中driverNameList
为被转化的数组。ArrayList
以及Arrays
的asList
方法比较高效。
同理,使用toArray
方法可以将列表转化为数组:
1
| driverNameList = tempList.toArray(driverNameList);
|
了解了这个方法,我们可以通过以下思路解题:
随机生成index->在index位置提取元素->将数组转换为列表->删除index位置的元素->转换回数组
听起来不错,于是博主的代码变成:
1
2
3
4
5
6
7
8
9
10
11
| int pos;
String driver;
//Get a random driver name
pos = RandomNumber(driverNameList);
driver = driverNameList[pos];
//Remove the driver from the array.
List<String> tempList = new ArrayList<>(Arrays.asList(driverNameList));
tempList.remove(pos);
driverNameList = tempList.toArray(driverNameList);
|
(RandomNumber
根据给予的数组长度返回个不超出数组大小的随机整数)看起来不错,但是博主实际测试的时候发现多次循环后driver
有时被赋值null
。不幸的事实是,以上转化过程中数组的大小和顺序没有变化,也就是说被抽取走的元素会被null
代替。想通这个环节以后,对代码稍加改动即可避免这个问题。最终版如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public static String Driver() {
int pos;
String driver;
//Use a do-while loop to ensure that driver's name is not none.
do
{
pos = RandomNumber(driverNameList);
driver = driverNameList[pos];
}while (driver == null);
//Remove the driver from the array.
List<String> tempList = new ArrayList<>(Arrays.asList(driverNameList));
tempList.remove(pos);
driverNameList = tempList.toArray(driverNameList);
return driver;
}
|
以上