【问题标题】:Finding duplicate INT in 2D array在二维数组中查找重复的 INT
【发布时间】:2013-10-17 15:19:11
【问题描述】:

我坚持这种方法。

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。我的方法不断出现错误。我究竟做错了什么?任何帮助,将不胜感激。请和谢谢。

【问题讨论】:

  • “重复”是什么意思?
  • 您只是将数组的一个元素与下一个元素进行比较,而不是比较所有元素。你学过套路吗?如果使用 add 将每个单元格的内容放入一个 Set (docs.oracle.com/javase/7/docs/api/java/util/HashSet.html#add(E)) 中,则可以检查返回类型。如果是假的,那你就被骗了!

标签: java arrays duplicates


【解决方案1】:

您的方法所做的只是检查两个连续元素是否相等,这不会告诉您有关不相邻的重复项的任何信息。一种方法是使用 Map&lt;Integer, Integer&gt; 将值映射到它们的频率:

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 的元素。

【讨论】:

  • 不应该是map.put(a, map.containsKey(a) ? map.get(a) + 1 : 1)
  • 是否可以仅使用 for 循环执行该方法?
  • @MarcellaRuiz 是的,您可以实现一个简单的算法来检查每个元素与所有其他元素。
【解决方案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;

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

【讨论】:

    【解决方案3】:
    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;
    }
    

    【讨论】:

    • 虽然他想知道重复的 int。
    【解决方案4】:

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

    就像 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);
            }
        }
    }
    

    然后要获得重复项,您可以找到任何大小 > 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);
         }
    }
    

    但这可能已经过头了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2020-07-16
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多