反复独特地结合一系列名称

时间:2015-01-14 13:21:58

标签: java arrays sorting round-robin

我试图用一系列名字(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);
        }
    }

但这会产生双打,据我所知,这不是最佳方式吗?

由于

1 个答案:

答案 0 :(得分:1)

如果我正确地理解了这个问题,我会将其重述为&#34;如何从给定列表中获得随机和唯一对的新列表&#34;。如果这不正确,请告诉我。

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

首先,如何从列表中获取随机对。最简单的方法是洗牌并取前两项:

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,因为它们是列表,如果它们的大小相同且每个项目相同,则返回true。

最后,您如何确保最终获得列表中正确数量的项目。你真的只需要在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)));
    }
}

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