洗牌阵列

时间:2014-07-08 19:30:52

标签: java arrays algorithm collections shuffle

我编写了一个方法来对一个字符串数组进行混洗所以任务是实现WhiteElephant概念(将所有参与者的名字放入一个容器(帽子,盒子,包等)并混合起来。然后,人从容器中选择一个名称,但不告诉任何人选择了哪个名字。他/她现在负责为所选人购买礼物。)  对于给定字符串数组的名称列表。应生成与原始元素匹配的赋值。我编写了一个方法来选择一个随机数并使用一个映射来存储这些值,以便每个数组值都有不同的索引。但这只打印出5个值。我现在很困惑。 **必须将一个人分配给另一个人;任何人都不得被分配给自己。

public static String[] generateAssignments(final String[] participants) {

   Random r = new Random();
   int size = participants.length;
   HashMap val = new HashMap();
   int change = 0;
   String[] assignments = new String[6];
   System.out.println("Using arrays");


   for(int i=0; i<size;i++) {
       for(int j =0; j<size; j++) {
           change = r.nextInt(size);
           if(val.containsValue(change) || change==i) {
               continue;
           }
           else val.put(i, change);
           assignments[i] = participants[change];
           System.out.println(assignments[i]);
           break;
       }   

   }

   return assignments;
}

感谢您的投入。谢谢,幸运

3 个答案:

答案 0 :(得分:0)

如果关键是只有一个人的映射,你只需要创建一个具有适当长度的数组并在每个数组中存储一个int?

int len = participants.length;
int[] map = new int[len];
Random r = new Random();
String list = "";
for(int i = 0; i < len; i++){
   int n = r.nextInt(0, len);
   while((n == i) || (list.contains(n.toString()))){
      n = r.nextInt(0, len);
   }
   list = list + n.toString();
   map[i] = n;
}

通过这种方式,您填充了一个数组,其中包含与已分配整数的人相对应的整数。

答案 1 :(得分:0)

我认为你可以使用Collections.shuffle(List)

public static String[] generateAssignments(final String... participants) {
  List<String> al = Arrays.asList(participants.clone());
  out: while (true) {
    Collections.shuffle(al);
    for (int i = 0; i < participants.length; i++) {
      if (al.get(i).equals(participants[i])) {
        continue out;
      }
    }
    break out;
  }
  return al.toArray(new String[0]);
}
public static void main(String[] args) {
  String[] in = new String[] {"Hello", "World", "Goodbye"};
  System.out.println(Arrays.toString(in));
  String[] out = generateAssignments(in);
  System.out.println(Arrays.toString(out));
}

答案 2 :(得分:0)

这对我来说很适合:

/**
 * Assigns secret santa giftees.
 * 
 * @param participants
 *            The participants in the secret santa drawing
 * @return An array of assigned giftees for the participants.
 */
public static String[] generateAssignments(final String[] participants) {
    String[] ret = new String[participants.length];
    Arrays.fill(ret, "Andreas");
    return ret;
}