Democracy Dies in Darkness

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

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

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

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

List tempList = new ArrayList(Arrays.asList(driverNameList));

[/pastacode]

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

同理,使用toArray方法可以将列表转化为数组:

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

driverNameList = tempList.toArray(driverNameList);

[/pastacode]

了解了这个方法,我们可以通过以下思路解题:

随机生成index->在index位置提取元素->将数组转换为列表->删除index位置的元素->转换回数组

听起来不错,于是博主的代码变成:

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

int pos;
String driver;

//Get a random driver name
pos = RandomNumber(driverNameList);
driver = driverNameList[pos];

//Remove the driver from the array.
List tempList = new ArrayList(Arrays.asList(driverNameList));
tempList.remove(pos);
driverNameList = tempList.toArray(driverNameList);

[/pastacode]

(RandomNumber根据给予的数组长度返回个不超出数组大小的随机整数)看起来不错,但是博主实际测试的时候发现多次循环后driver有时被赋值null。不幸的事实是,以上转化过程中数组的大小和顺序没有变化,也就是说被抽取走的元素会被null代替。想通这个环节以后,对代码稍加改动即可避免这个问题。最终版如下:

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

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 tempList = new ArrayList(Arrays.asList(driverNameList));
        tempList.remove(pos);
        driverNameList = tempList.toArray(driverNameList);
        return driver;
    }

[/pastacode]

以上

点赞

5
说点什么

avatar
10000
4 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
abyXterminusP自然Ghost Recent comment authors

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
最新 最旧 得票最多
订阅
Ghost
游客

唉=。=评论框架用per没用...

Ghost
游客

土豪我是你steam好友Colorful_Ghost
最近写的C语言从数组中排序抽取不重复的元素

#include
int main()
{
void swap(int *a1, int *a2);
int a[10] = {20,8,40,12,33,36,20,40,25,33}, i, j;
for (j = 0; j<9; j++)
{
for (i = 0; i*(a + i + 1))
swap(a + i, a + i + 1);
}
for (i = 0; i < 10; i++)
{
if (*(a + i) == *(a + i + 1))
{
*(a + i) = 0;
*(a + i + 1)= 0;
}
}
}
for (i = 0; i<10; i++)
{
if (*(a+i)!=0)
{
printf("%d ", *(a + i));
}
}
printf("n");
}
void swap(int *a1, int *a2)
{
*a1 = *a1 + *a2;
*a2 = *a1 - *a2;
*a1 = *a1 - *a2;
}

Ghost
游客

[抛钱]已经添加友链啦QwQ~~
http://ghost-hentai.wang/

自然
游客
自然

哎,看不懂yi