假设我想在 8 x 6 网格上生成 20 个随机数。(8 列,6 行)。基于这里的答案:Creating random numbers with no duplicates ,我的代码是这样写的:
Random randomNumGenerator = new Random();
Set<Integer[][]> generated = new LinkedHashSet<Integer[][]>();
while (generated.size() < 20) {
int randomRows = randomNumGenerator.nextInt(6);
int randomColumns = randomNumGenerator.nextInt(8);
generated.add(new Integer[][]{{randomRows,randomColumns}});
}
实际上发生的是Set
,参见Integer[][]{{5,5}};
和Integer[][]{{5 ,5}};
不重复。为什么?即使我的目的是获得 20 个不重复的数字,但这也是行不通的。我该如何解决这个问题?
最佳答案
Set
使用其内部类型的 equals
方法(以及 hashCode
方法)检查重复项,但 Integer[][]
的 equals
方法比较内存地址而不是内容。
如果您只想存储对,为什么要使用 Integer[][]
的 Set
?
不幸的是,Java 中没有 Pair
类,但如果您不想创建自己的类,则可以使用 Map.Entry
来实现。
Random randomNumGenerator = new Random();
Set<Map.Entry<Integer, Integer>> generated = new LinkedHashSet<>();
while (generated.size() < 20) {
int randomRows = randomNumGenerator.nextInt(6);
int randomColumns = randomNumGenerator.nextInt(8);
generated.add(new AbstractMap.SimpleEntry<>(randomRows,randomColumns));
}
System.out.println(generated);
关于java - 无法使用 Set 删除重复的对号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776161/