我一直在努力创建一个函数来基本上找到多维数组中的重复元素的所有索引(未排序),在本例中是一个5x5数组,然后使用索引找到更改中的并行元素得分数组。但是只能在列中找到重复项而不是在数组中找到其他列。这是我到目前为止所做的,在线研究。这段代码的主要问题是它会找到所有重复的元素,但不会找到原件。例如:如果数组包含元素: 并行{{“”“,”a“,”a“},{”b“,”b“,”b“},{”a“,”c“,”a“}},然后它应该改变并行得分数组为:{{0,1,0},{1,1,1},{0,1,0}}。但相反,它只识别最后一行并且顶行是重复的。
代码:
public static void findDuplicates(String a[][])
{
System.out.println("*Duplicates*");
Set set = new HashSet();
for(int j = 0; j<a.length; j++)
{
for(int i=0; i < a[0].length; i++)
{
if(!set.contains(a[i][j]))
{
set.add(a[i][j]);
}
else
{
System.out.println("Duplicate string found at index " + i + "," + j);
scores[i][j] -= scores[i][j];
}
}
set = new HashSet();
}
}
我知道我的解释有点复杂,但希望这是可以理解的。谢谢, 杰克。
答案 0 :(得分:3)
你的逻辑错误。你的外循环是j
,内循环是i
,但你正在做:
set.add(a[i][j]);
应该是相反的方式:
set.add(a[j][i]);
从技术上讲,如果数组不是NxN,你可能会遇到越界异常。但你可以说这是一个先决条件。
出于某种原因,你也设置为0:
scores[i][j] -= scores[i][j];
为什么不呢:
scores[i][j] = 0;
但要在列中找到重复项:
public static void findDuplicates(String a[][]) {
for (int col=0; col<a[0].length; col++) {
Map<String, Integer> values = new HashMap<String, Integer>();
for (int row=0; row<a.length; row++) {
Integer current = values.put(a[row][col], row);
if (current != null) {
scores[row][col] = 0;
scores[current][col] = 0;
}
}
}
}
这是如何运作的?
row
和col
。当i
和j
更具描述性时,我没有理由使用row
和col
; Map
来存储每个值的索引。如果密钥已在Map.put()
中,则Map
会返回旧值。如果是这种情况,你发现了重复; scores[current][col]
将被多次设置为0,这是不必要的但不会有害,并且会使代码更简单。Map
。这是有用且可取的。它说Map
有String
个密钥和Integer
值,可以节省一些内容; int
(循环变量)转换为包装类Integer
。