java - 无法使用 Set 删除重复的对号

标签 java set

假设我想在 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/

相关文章:

java - 有没有办法在没有引用的情况下在 Java 中复制双重 LinkedList?

java - 马尔可夫链文本生成

java - 如何使用accumulate进行多次运算和集合

java - 通过电子邮件标题检测电子邮件正文语言的可能性

c++ - 在 C++ 中替换集合的最佳方法

ruby - Ruby 中有集合吗?

java - 类型不兼容和 System.out.print 错误?

c++ - 了解扫描线最近对的具体实现

jquery - 更改 iframe 元素的值

c++ - 如何使用 std::map 或 set 管理目录路径?