Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用Set删除重复的对号_Java_Set - Fatal编程技术网

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

Java 无法使用Set删除重复的对号,java,set,Java,Set,假设我想在8×6的网格上生成20个随机数(8列,6行)。根据这里的答案:,我写的代码如下: Random randomNumGenerator = new Random(); Set<Integer[][]> generated = new LinkedHashSet<Integer[][]>(); while (generated.size() < 20) { int randomRows = randomNumGenerator.nextInt(6);

假设我想在8×6的网格上生成20个随机数(8列,6行)。根据这里的答案:,我写的代码如下:

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}});
}
Random randomNumGenerator=new Random();
生成的集合=新LinkedHashSet();
while(生成的.size()<20){
int randomRows=randomNumGenerator.nextInt(6);
int randomColumns=randomNumGenerator.nextInt(8);
add(新整数[][{{randomRows,randomColumns}});
}

实际上,所发生的是
集合
参见
Integer[]{{5,5}
整数[]{{5,5}不重复。为什么?即使我的目的是得到20个不重复的数字对,这也不行。如何解决此问题?

数组
equals
在Java中是
=
,因此数组只与自身相等。通常使用
Arrays.equals(array1,array2)
按内容进行比较,但在这种情况下,数组是错误的选择。您可以创建一个bean,正如rafalopez79建议的那样,使用
集合
的数组(
列表
),因为列表将比较
等于
上的内容,请参阅。选择基本上是你的,一个bean可能会更干净一些。

这段代码怎么样。我通过调试器运行了它,它工作得很好,是的,contains()方法检查整数的值,而不是引用。你可以根据需要改变随机数的范围,我用5来方便测试。是的,我知道它不是很健壮,正如我所写的,这将是一个无止境的循环(因为5的范围有限),但这是一个简单的例子来说明这一点

更新:实际上这有一个错误,它不会检查所有行的唯一性,但也很容易修复。我只是重新阅读了原始问题,看了看原始代码,我不确定我是否知道你到底想要什么。如果你只想要一个48个唯一的整数,8乘6排列的网格,这就可以了,但是有几种方法可以做到这一点

    final int rows = 6;
    final int cols = 8;

    Random randomGenerator = new Random();


    ArrayList[] grid = new ArrayList[rows];

    for(int i=0; i<rows; i++)
    {
        grid[i] = new ArrayList<Integer>();

        for(int j=0; j<cols; j++)
        {
            for(;;)
            {
                Integer newInt = new Integer(randomGenerator.nextInt(5));               
                if(!grid[i].contains(newInt))
                {
                    grid[i].add(newInt);
                    break;
                }   
            }

        }
    }
final int rows=6;
最终整数cols=8;
Random randomGenerator=新的Random();
ArrayList[]网格=新的ArrayList[行];

对于(int i=0;i,
Set
使用其内部类型的
equals
方法(以及
hashCode
方法)检查重复项,但是
Integer[][]
equals
方法比较内存地址,而不是内容

如果您只想存储对,为什么要使用
整数[]
集合
? 不幸的是,在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);
Random randomNumGenerator=new Random();
生成的集合=新LinkedHashSet();
while(生成的.size()<20){
int randomRows=randomNumGenerator.nextInt(6);
int randomColumns=randomNumGenerator.nextInt(8);
add(新的AbstractMap.SimpleEntry(randomRows,randomColumns));
}
系统输出打印项次(已生成);

必须将该对包装在bean中,并重写hashCode()和equals()方法七如果数组包含相同的元素,它们在内存中是不同的对象我被你的代码搞糊涂了…看起来你的集合是一组二维整数数组。所以如果你想要一整组这些网格,我想你可以这样做,但我想你只需要一个网格,对吗?