我编写了一个方法来对一个字符串数组进行混洗所以任务是实现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;
}
感谢您的投入。谢谢,幸运
答案 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;
}