用于将HashMap键与另一个随机HashMap键匹配的算法,从不复制值或匹配自身

时间:2015-11-12 22:15:14

标签: java algorithm sorting hashmap

这可能不是最合乎逻辑/最简单/最有效的方式。我希望对更好的逻辑有一些意见,所以我宁愿尝试解释这个问题。

列表:

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可能不是存储它的最合理方式。

3 个答案:

答案 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);
}

以上是基本概要,可能需要更多工作,但这似乎是一种很好的方法。