在2D数组中查找重复的INT

时间:2013-10-10 02:26:07

标签: java arrays duplicates

我坚持这种方法。

public class Duplicate{


   public static boolean extra(int [][] grid)
   {
       for(int i = 0; i < grid.length; i++)
           for(int j = 0; j < grid[i].length-1; j++)
              if(grid[i][j] == grid[i][j+1])
              {
                  System.out.println(grid[i][j]);
                  return true;
              }
    return false;
   }

   public static void main(String[] args){

      int [][] grades = {{3,5,8,7},
                        {2,1,11,4},
                       {13,20,10,6},
                        {7,0,12,15}
                       };

       System.out.print(extra(grades));   
   }
 }

我想查找数组中是否有任何重复的int。如果存在,则返回true,并且重复的int。我的方法一直出现错误。我究竟做错了什么?任何帮助,将不胜感激。拜托,谢谢你。

4 个答案:

答案 0 :(得分:2)

你所做的所有方法都是检查两个连续的元素是否相等,这并不能告诉你任何不相邻的重复元素。一种方法是使用Map<Integer, Integer>将值映射到它们的频率:

Map<Integer, Integer> map = new HashMap<>();

for (int[] row : grid) {
    for (int a : row) {
        map.put(a, map.containsKey(a) ? map.get(a) + 1 : 1);
    }
}

然后,您可以遍历此地图的条目,以查找频率大于或等于2的元素。

答案 1 :(得分:2)

要重写您的方法,以便它可以工作:

ArrayList<Integer> comeBefore = new ArrayList<Integer>();
for(int i = 0; i < grid.length; i++) {
    for(int j = 0; j < grid[i].length; j++) {
        if(comeBefore.contains(grid[i][j])) {
            System.out.println(grid[i][j]);
            return true;
        }
        comeBefore.add(grid[i][j]);
    }
}
return false;

我现在没有时间考虑它......但也许一套或类似的将是一个更有效的数据结构。这段代码可能也不对......但这是它的要点;它是未经测试的。

答案 2 :(得分:1)

private static boolean extra(int[][] data) {
    Set<Integer> set = new HashSet<Integer>();
    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[i].length; j++) {
            if (set.contains(data[i][j])) {
                return true;
            } else {
                set.add(data[i][j]);
            }
        }
    }
    return false;
}

答案 3 :(得分:1)

您只是将循环中的相邻数字与此行if(grid[i][j] == grid[i][j+1])

进行比较

像使用Map所提到的arshajii将是一种方法。如果你想保留每个副本的坐标,那么你可以扩展arshajii的答案以获得这样的列表地图。

Map<Integer, List<Point>> map = new HashMap<>();

for(int i = 0; i < grid.length; i++)
{
    for(int j = 0; j < grid[i].length; j++)
    {
        int val = grid[i][j];
        if(map.containskey(val))
             map.put(val, map.get(val).add(new Point(i,j));
        else
        {
             List<Point> li = new ArrayList<>();
             li.add(new Point(i,j));
             map.put(val, li);
        }
    }
}

然后,为了获得重复项,您会找到任何大小为&gt;的密钥。 1,你可以得到坐标

for(Integer key : map.ketSet())
{
     List<Point> li = map.get(key);
     if(li.size() > 1)
     {
          System.out.println("The value " + key +" was duplicated at the indices: ");
          for(Point p : li)
             System.out.println(p.x + ", " + p.y);
     }
}

但这可能是最重要的!