我正在尝试用一系列名字(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);
}
}
但这会产生 double ,据我所知这不是最好的方法吗?
最佳答案
如果我正确理解了这个问题,我会将其重述为“如何从给定列表中获取随机且唯一对的新列表”。如果这不正确,请告诉我。
如果是这样,那么它可以分为几个单独的问题。
首先,如何从列表中获取随机对。最简单的方法是打乱列表并取出前两项:
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)));
}
}
这保证了这些对是唯一的,因为第二个索引总是大于第一个索引。
关于java - 重复唯一的一对名称数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27943972/