重复唯一地耦合名称数组
Repeatedly uniquely couple array of names
我正在尝试从一组名称中组合成情侣 (naam
)。每次我 运行 时,这些情侣都必须是独一无二的。案例是一位老师试图在 amountWeeks
周内制作情侣,情侣必须与其他周不同,不能有 Bob - Alice
和 Alice - 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)));
}
}
这保证了对是唯一的,因为第二个索引总是大于第一个。
我正在尝试从一组名称中组合成情侣 (naam
)。每次我 运行 时,这些情侣都必须是独一无二的。案例是一位老师试图在 amountWeeks
周内制作情侣,情侣必须与其他周不同,不能有 Bob - Alice
和 Alice - 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)));
}
}
这保证了对是唯一的,因为第二个索引总是大于第一个。