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

Life in America

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

2015年11月22日 Java 5

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

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

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

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

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

driverNameList = tempList.toArray(driverNameList);

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

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

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

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代替。想通这个环节以后,对代码稍加改动即可避免这个问题。最终版如下:

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;
    }

以上

Lin
Follow me at

Lin

博主 at Lin's Treasure
博主真身,目前运维 Lin's Treasure 以及附属的 LTTN。纯属一介普通人,对高技只会操不会做。能熟练开关电脑、敲打电视、弄砸考试云云。目前暂居(大误)万恶之源美帝,深感国内射秽主义大法好。爱前沿CE,爱音乐,爱游泳,爱游戏,爱折腾。资深安卓粉和肠粉。编程菜鸟。若有不足,敬请指教ww
Lin
Follow me at

Latest posts by Lin (see all)

 

说点什么

5 评论 在 "Java从数组中抽取随机、不重复的元素"

avatar
10000
  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