黑马程序员技术交流社区

标题: 关于数组随机乱序的问题 [打印本页]

作者: 想飞的鱼    时间: 2014-6-10 16:32
标题: 关于数组随机乱序的问题
本帖最后由 想飞的鱼 于 2014-6-15 12:00 编辑

ps: 妹妹在读小学,老师布置作业总让家长随机提问课后生字并默写(按顺序提写就不行么==!!)
所以写了个小程序,要求随机输出已存储的汉字,绞尽脑汁想起了三个思路,下面贴代码
请问各路大神随机排序都有哪些方法?那种最高效?如:洗牌,实际开发中都用什么?
  1. /*
  2. 需求:随机输出存入的汉字,不能重复,不能缺少(就是随机乱序)

  3. 思路一:
  4. 1,将字符串按“,”切割,并返回String[]
  5. 2,遍历数组并将元素存入set集合
  6. 3,取出即使无序的----但是每一次运行都是一样的,因为hashset集合按哈希表存

  7. 思路二:
  8. 1,将字符串按“,”切割,并返回String[]
  9. 2,遍历数组并将元素存入List集合
  10. 3,使用Collections的shuffle方法随机排序
  11. 4,取出----随机,每次运行都不一样

  12. 思路三:如何不使用shuffle方法完成呢?
  13. 1,将字符串按“,”切割,并返回String[]
  14. 2,产生随机数,0——arr.length之间,但不重复,而且不能缺少数字(如随机生成0——10全有且不重复)
  15.         代码实现:用ArrayList集合,而不用set,因为set集合会按哈希表排序
  16. 3,将随机数当作数组角标取出对应元素
  17. */

  18. import java.util.*;

  19. class RandomWordTest
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 String word = "衣,服,衬,衫,电,视,风,扇";
  24.                
  25.                 //randomSort_1(word);
  26.                 //randomSort_2(word);
  27.                 randomSort_3(word);
  28.         }
  29.         public static void randomSort_1(String word)
  30.         {
  31.                 String [] arr = word.split(",");

  32.                 Set<String> s = new HashSet<String>();
  33.                 for (int x=0; x<arr.length; x++)
  34.                 {
  35.                         s.add(arr[x]);
  36.                 }

  37.                 int count = 1;
  38.                 Iterator<String> it = s.iterator();
  39.                 while (it.hasNext())
  40.                 {
  41.                         String word_2 = it.next();
  42.                         System.out.println(count++ +"::"+word_2);
  43.                 }
  44.         }
  45.         public static void randomSort_2(String word)
  46.         {
  47.                 String [] arr = word.split(",");
  48.                
  49.                 List<String> l = new ArrayList<String>();
  50.                 for (int x=0; x<arr.length; x++)
  51.                 {
  52.                         l.add(arr[x]);
  53.                 }

  54.                 Collections.shuffle(l);

  55.                 int count = 1;
  56.                 for(String str : l)
  57.                 {
  58.                         System.out.println(count++ +"::"+str);
  59.                 }
  60.         }
  61.         public static void randomSort_3(String word)
  62.         {
  63.                 String[] arr = word.split(",");
  64.                
  65.                 Random rd = new Random();
  66.                 ArrayList<Integer> al = new ArrayList<Integer>();

  67.                 while (true)
  68.                 {
  69.                         int num = rd.nextInt(arr.length);//产生随机数,0——arr.length之间,符合arr的角标
  70.                         Integer i = Integer.valueOf(num);//将num转成Integer对象

  71.                         if (!al.contains(i))
  72.                                 al.add(Integer.valueOf(num));//如果ArrayList集合不包含这个数,才存入

  73.                         if (al.size()==arr.length)//当集合的长度等于了数组的长度,则表示角标全有了且随机乱序,跳出循环
  74.                                 break;
  75.                 }
  76.                 int count = 1;
  77.                 for(Integer in : al)
  78.                 {
  79.                         int index = in.intValue();
  80.                         System.out.println(count++ +"::"+arr[index]);//按照随机乱序的角标取出相应元素
  81.                 }
  82.         }
  83. }
复制代码





作者: 月光海    时间: 2014-6-10 16:47
代码木有看,对List集合随机排序不是有Collections类中的方法么,好像是以s开头的,记不清了,你去看看API把




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2