背景
之前有个位朋友给我了一看了一段代码,大致意思是给一个列表,里面元素是人,需要将一个列表的用户随机分成两拨人,关键词是“随机”
List<String> allPerson = new ArrayList<String>(); allPerson.add("何XX"); allPerson.add("李XX"); allPerson.add("屈XX"); allPerson.add("刘XX"); allPerson.add("王XX"); allPerson.add("涂XX"); allPerson.add("张XX"); allPerson.add("方XX"); allPerson.add("何XX"); allPerson.add("周XX"); List<String> aGroup = new ArrayList<String>(); List<String> bGroup = new ArrayList<String>(); for(int i=0; i<10; i++){ String seedPerson = allPerson.get(new Random().nextInt(allPerson.size())); if(i%2==0){ bGroup.add(seedPerson); }else{ aGroup.add(seedPerson); } allPerson.remove(seedPerson); } //A组名单 System.out.println("A组名单"); for(String aStr:aGroup){ System.out.println(aStr); } //B组名单 System.out.println("B组名单"); for(String bStr:bGroup){ System.out.println(bStr); }
大致意思是在将allPerson中的元素,随机分到aGroup 和bGroup 两个列表中去。核心的意思是每次从剩下的allPerson列表中随机取出(String seedPerson = allPerson.get(new Random().nextInt(allPerson.size()));
)一个员工,然后按照对2取模之后放到它应该的队列中去。
优化
看了这段代码以我对代码的审美标准,完全没有美感。于是很快的写了一段我认为美的代码:
List<String> allPerson = new ArrayList<String>(); allPerson.add("何XX"); allPerson.add("李XX"); allPerson.add("屈XX"); allPerson.add("刘XX"); allPerson.add("王XX"); allPerson.add("涂XX"); allPerson.add("张XX"); allPerson.add("方XX"); allPerson.add("何XX"); allPerson.add("周XX"); List<String> aGroup = new ArrayList<String>(); List<String> bGroup = new ArrayList<String>(); p = [aGroup ,bGroup ]; for(int i=0;i<allPerson.size();i++){ p[(int)(Math.random()*2)].add(list.get(i)); }
写完给我朋友看了一下,被他一语道破,最后得出的结果根本不符合他的需求,因为他要求的是两个列表结果集合是要相同的大小,我写的算法两个列表的大小是随机的,所以这个写法是错的。
被他指出之后,我重新想了一下该怎么写。应该先将列表随机排序一下,像这样的算法像我这样的懒人怎么会去开发呢,当然要依赖jdk中已经有的sdk工具。于是写了下面这段代码:
public void test() { List<String> allPerson = new ArrayList<String>(); allPerson.add("何XX"); allPerson.add("李XX"); allPerson.add("屈XX"); allPerson.add("刘XX"); allPerson.add("王XX"); allPerson.add("涂XX"); allPerson.add("张XX"); allPerson.add("方XX"); allPerson.add("何XX"); allPerson.add("周XX"); List<String> aGroup = new ArrayList<String>(); List<String> bGroup = new ArrayList<String>(); Collections.shuffle(allPerson); vist(allPerson.iterator(), aGroup, bGroup); System.out.println(aGroup); System.out.println(bGroup); } private void vist(Iterator<String> it, List<String> aGroup, List<String> bGroup) { if (!it.hasNext()) { return; } aGroup.add(it.next()); vist(it, bGroup, aGroup); }
这里利用了Collections.shuffle()这个函数先将allPerson 打散,然后用的迭代函数vist遍历allPerson,在每次迭代的时候将aGroup和bGroup参数位置互换一下,就能起到均匀给两个子列表添加记录了。当然这个遍历可以使用for循环用一个迭代子i++,每次判断取模之后是否为0,向两个子group中均匀添加数据。这种迭代的用法属于函数式编程的一个例子,每次看到迭代的方式实现一个函数,总感觉透着一股泥土般的清香,不是吗?
相关推荐
用VB制作的一个随机分组工具,简单方便,可自定义要分组的名单(只需在文本文件中按行输入名字即可)。
简单初级的人员随机分组及抽签工具及源码,由VS2010编写,可用于人员随机分组和人员随机顺序抽签。抓阄分组。
一款简单易行的实验动物随机分组软件 很不错
进行各种培训时对需要培训的人员随意进行分组,简单易用!
简单初级的人员随机分组及抽签工具及源码,由VS2010编写,可用于人员随机分组和人员随机顺序抽签。抓阄分组。
实现简单的随机抽查学号为0~38的同学的功能
一个简单实现数据分组的程序,可以对最多10人进行随机分成2个对抗小组
满足较大规模人员面试考核时,对多组多岗位类的考务、考官人员的随机分组确定;随机排序组合,结果pdf加水印保存。 使用:在解包文件夹中,点击index.html,输入考核项目名称,即可进入分组抽签页面,页面设“项目...
发现大家在团队时都不想当组长,就随便写了一个随机生成组长的程序,直接点击未命名,然后录入组员名字,然后点击生成随机数,程序根据 组员人数生成相应的票数。可以多次点击随机生成,完成后点击确定。 程序里面有...
实现简单的比赛抽签分组,list.txt文件里存入参加比赛的人名,程序中填入每组多少人 一键便可随机分组。
北京等地目前采用随机摇号方式取得购车指标。简单的随机方式会导致“多摇不中”现象,也未考虑申请人对车辆...仿真实验表明,提出的算法能够有效地减少摇号过程中的不合理因素,为车辆摇号问题提供了一种新的解决途径。
python的random模块中有一些生成随机数字的方法,例如random.randint, random.random, random.uniform, random.randrange,这些函数大同小异,均是在返回指定范围内的一个整数或浮点数,下边简单解释一下这几个函数...
循环英雄随机化器
主要是分组之后警匪两拨人员战斗力总值十分接近并且是随机的,也就是说在实例相差不大的情况下随机分组,里面还有将类的实例保存成配置文件以及把配置文件还原成类的方法 简单易用,算法没啥主要是思路
这些方法旨在对形成列联表的数据进行分组,但是通过定义使用准蒙特卡洛数和两个边际经验分位数对数据进行分组的规则,可以将这些方法扩展为处理完整数据。 该规则在非负象限上隐式定义了点以形成二次距离,并指出了...
学习Python对分组和列表肯定不陌生,它们是python的组成基础,但往往我们在应用中很容易将这两者搞混,甚至有的时候辛辛苦苦敲...通过切片操作可以生成一个新的序列。实现切片操作的语法格式如下: sname[start:end:ste
比特尼克 免责声明:这里有一些可疑的代码注释,但当时我 20 岁,所以就是这样。...通过为第一个单词放置一个随机词性标签,然后添加一个可以跟随它的词性来生成一个句子,依此类推,直到句子结束。
一个简单的Android点名单机系统,包括请销假、人员统计,分组统计等功能
不过似乎有一个问题:单词is和great分别在每个WordCounter各计数一次。怎么会这样? 当你调用shuffleGrouping时,就决定了Storm会以随机分配的方式向你的bolt实例发送消息。 在这个例子中,理想的做法是相同的...