查找重复的数组元素

时间:2010-02-02 20:07:26

标签: java arrays

我一直在努力创建一个函数来基本上找到多维数组中的重复元素的所有索引(未排序),在本例中是一个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();
    }
}

我知道我的解释有点复杂,但希望这是可以理解的。谢谢, 杰克。

1 个答案:

答案 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;
      }
    }
  }
}

这是如何运作的?

  • 我已将循环变量重命名为rowcol。当ij更具描述性时,我没有理由使用rowcol;
  • 和我一样,我假设输入数组是正确的前提条件。然而,它可以是NxM(而不仅仅是NxN);
  • 我使用Map来存储每个值的索引。如果密钥已在Map.put()中,则Map会返回旧值。如果是这种情况,你发现了重复;
  • 当前(row,col)和(current,col)设置为0.为什么从自身中减去分数而不是简单地设置为0?
  • 如果在列中找到值“a”超过3次,那么scores[current][col]将被多次设置为0,这是不必要的但不会有害,并且会使代码更简单。
  • 我已使用泛型声明Map。这是有用且可取的。它说MapString个密钥和Integer值,可以节省一些内容;
  • 它还使用自动装箱和自动取消装箱将int(循环变量)转换为包装类Integer