重复唯一地耦合名称数组

Repeatedly uniquely couple array of names

我正在尝试从一组名称中组合成情侣 (naam)。每次我 运行 时,这些情侣都必须是独一无二的。案例是一位老师试图在 amountWeeks 周内制作情侣,情侣必须与其他周不同,不能有 Bob - AliceAlice - Bob。如果你没有注意到,是的,这是一项任务。我知道你对此的政策,但我一直坚持这一点,即使朝着正确的方向推动也会有很大帮助。

我一直这样做:

for (int n = 1; n < amountWeeks + 1; n++) {
    Object[] x = {"WEEK", "<html><b>" + n + "</b></html>"};
    model.addRow(x);
    pos1 = 1;
    pos2 = naam.size() - n;
    for (int i = 0; i < naam.size() / 2; i++) {
        Object[] row = {naam.get(pos1), naam.get(pos2)};
        pos1++;
        pos2 = pos2 - n;
        if (pos2 == pos1) {
            pos2 = pos2 - 1;
        }
        if (pos2 < (naam.size() - 1) / 2) {
            pos2 = pos2 + (naam.size() - 1) / 2;
        }
        model.addRow(row);
    }
}

但这会产生双打,据我所知这不是最好的方法吗?

如果我正确理解了这个问题,我会将其重述为 "how do I obtain from a given list a new list of random and unique pairs"。让我知道这是否不正确。

如果是这样,那么它可以分成几个单独的问题。

首先你如何从列表中随机获得一对。最简单的方法是打乱列表并取前两项:

Collections.shuffle(list);
List<Object> pair = Arrays.asList(list.get(0), list.get(1));

其次,如何检查该对是否已在结果列表中。如果您总是在添加之前对列表进行排序,这很容易:

Collections.sort(pair);
if (!resultList.contains(pair)) {
    resultList.add(pair);
}

之所以可行,是因为 contains 对项目调用 equals,因为它们是列表,所以如果它们大小相同且每个项目都相等,则 return 为真.

最后,如何确保最终列表中的项目数量正确。你真的只需要在 while 循环中检查大小。

resultList = new ArrayList<>();
while (resultList.size() < n) {
    ....
}

我会把它留给你把它们放在一起。我会注意到你有一个危险,即源列表不够长,无法生成足够的对。您可以相当简单地检查它作为该方法的入口条件,但我也会让您自己弄清楚。

如果不需要随机性,那么您可以系统地浏览列表:

for (int first = 0; resultList.size() < n && first < list.size(); first++) {
    for (int second = first + 1; resultList.size() < n && second < list.size(); second++) {
        resultList.add(Arrays.asList(list.get(first), list.get(second)));
    }
}

这保证了对是唯一的,因为第二个索引总是大于第一个。