目录

Java从数组中抽取随机、不重复的元素

目录

写在前面:本人也是Java菜鸟与初学者,如有不当烦请指正

在昨天的作业中一个步骤需要从一个巨大的数组[Array]中随机抽取元素,而且不能重复。众所周知数组一旦创建大小就不能改变,因此我们需要将数组转化为列表[List]以便操作。转化思路(之一)如下:

1
List<String> tempList = new ArrayList<>(Arrays.asList(driverNameList));

其中driverNameList为被转化的数组。ArrayList以及ArraysasList方法比较高效。

同理,使用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;
} 

以上

相关内容