gpt4 book ai didi

java - 如何从单个列表中挑选独特的对

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:32 25 4
gpt4 key购买 nike

我正在创建一个程序,其中涉及一段代码,我需要在其中从单个项目(名称)列表中挑选对。

初始列表来自单个 ArrayList<String>其中包含所有唯一的人名。

我的尝试如下:

//Performance is not really a focus as the lists are small (20 ~ 60 elements),
//thus I use a SecureRandom instead of a Random.
SecureRandom rnd = new SecureRandom();

//List of names
ArrayList<String> Names = new ArrayList<>();

//Names populated somewhere here..

//Make a secondary array which houses the available names...
ArrayList<String> AvailNames = new ArrayList<>();
AvailNames.addAll(Names);

LinkedHashMap<String, String> NamePair = new LinkedHashMap<>();
Iterator<String> Iter = Names.iterator();

// LOOP A
while(Iter.hasNext()){
String name = Iter.next();
int index;

/*
* LOOP B
* Find a unique pair randomly, looping if the index is the same.
* Not the most efficient way, but gets the job done...
*/
while(true){
index = rnd.nextInt(AvailNames.size());
if(!AvailNames.get(index).equals(name)){
break;
}
}

NamePair.put(name, AvailNames.remove(index));
}

当名称数量为奇数时,我遇到了 LOOP B 的问题(见上文)无限期地运行。

我发现问题出在这样一个事实:有时,当所有对都被取走时,剩下的最后一个名字对不是唯一的,导致 if 语句永远不会为真。

以列表为例:

  1. A
  2. B
  3. C
  4. D
  5. E

程序在执行过程中,可能首先将 A 排序到 D,创建如下名称对:

  1. A - B
  2. B - C
  3. C - D
  4. D - C

留下E - E作为最后一对,不允许作为一对(因为项目/名称不是唯一)。由于配对分配是随机的,有时它会起作用,有时它不起作用,坦率地说这很烦人......

我确信解决方案非常简单,但出于某种原因,我似乎无法找到解决此问题的方法。感谢您的帮助。

最佳答案

您可以检测到何时遇到这种情况,只需将最后一个 AvailName 与随机选择的前一对中的第二个元素交换即可。例如,如果您选择了第二对,您会将其更改为 B-E,然后您的最后一对将是 E-C。

这将始终给出两对,每对具有不同的第一和第二元素:所选对不能将 E 作为其第一个元素(您将生成唯一的对)或作为其第二个元素(否则 E不会出现在 AvailName 中)。

关于java - 如何从单个列表中挑选独特的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19875633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com