这可能不是最合乎逻辑/最简单/最有效的方式。我希望对更好的逻辑有一些意见,所以我宁愿尝试解释这个问题。
列表:
Jon - null
Dad - null
Mom - null
Thor - null
July - null
我想创建一个方法,将这些方法随机地与另一个'key'匹配,没有重复值或者具有相同的键和值。
另一个问题是如果有例如3个键。
1 - null
2 - null
3 - null
迭代1:
1 - 2
2 - null
3 - null
迭代2:
1 - 2
2 - 1
3 - null
迭代3:
???
HashMap可能不是存储它的最合理方式。
答案 0 :(得分:3)
你所说的是一种紊乱。据我所知,很难以这样的方式产生紊乱,以至于它们都是同样可能的,但是有一种合理有效的方法可以产生紊乱。
简单地遍历键并从尚未使用的键组中随机分配值,始终避免使用当前键。
实际上你只能在最后一步陷入困境。例如。像这样的东西
1 - 2
2 - 4
3 - 1
4 - 3
5 - ???
如果发生这种情况,只需选择其中一个已选择的值,然后交换。
1 - 2
2 - 5 <-- swap
3 - 1
4 - 3
5 - 4 <-- swap
Set
实现long
以及获取随机元素的有效方法{。{3}}。
答案 1 :(得分:1)
答案不在java中,但由于这更像是一个算法问题,我相信你可以弄清楚如何将python翻译成java:
import random
# The original collection, using a set instead of map/hash since we don't care
# about the values
set1 = set(range(100))
# Make a copy of set1, we're using a list here so that random.choice will work
set2 = list(set1)
pairs = []
for i in set1:
# Deal with the final item being the same in both collections,
# swap with the first one
if len(set2) == 1 and i == set2[0]:
tmp = pairs[0][1]
pairs[0][1] = set2[0]
pairs.append([i,tmp])
break
# Pick random items from set2 until you get one that isn't the same as i
while True:
j = random.choice(set2)
if i != j:
break
# Remove the value from set2 so we won't pick it again
# In this example, set2 is actually a list so that random.choice would work on it
# This could be kind of expensive, might be better using an actual set
set2.remove(j)
# Add our pair to the paired up list
pairs.append([i,j])
答案 2 :(得分:0)
将列表复制到队列中,随机播放,然后从列表和队列中分配对。如果队列中的元素相同,则将其放回尾部并取下一个。
List<String> list = <list with your items>;
ArrayDeque<String> queue = new ArrayDeque<>(list1);
Collections.shuffle(queue);
List<StringPair> result = new ArrayList<>();
for (String s : list) {
for (String s2; (s2 = queue.poll()).equals(s);)
queue.offer(s2);
result.add(s, s2);
}
以上是基本概要,可能需要更多工作,但这似乎是一种很好的方法。