Java 无法使用Set删除重复的对号
假设我想在8×6的网格上生成20个随机数(8列,6行)。根据这里的答案:,我写的代码如下: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);
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()方法七如果数组包含相同的元素,它们在内存中是不同的对象我被你的代码搞糊涂了…看起来你的集合是一组二维整数数组。所以如果你想要一整组这些网格,我想你可以这样做,但我想你只需要一个网格,对吗?