1

私はこの方法にこだわっています。

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 があるかどうかを調べたい。重複する int がある場合は true を返します。私のメソッドは FALSE を出し続けます。私は何を間違っていますか?どんな助けでも大歓迎です。よろしくお願いします。

4

4 に答える 4

2

メソッドが行っているのは、2 つの連続する要素が等しいかどうかをチェックすることだけです。隣接していない重複については何もわかりません。これを行う 1 つの方法は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 以上の要素を見つけることができます。

于 2013-10-10T02:31:26.607 に答える
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;
}
于 2013-10-10T02:41:09.867 に答える
1

ループ内の隣接する数値のみをこの行と比較していますif(grid[i][j] == grid[i][j+1])

arshajii が述べたように、Map will を使用することは、これを行う 1 つの方法です。各複製の座標を保持したい場合は、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);
     }
}

しかし、これはおそらく最高です!

于 2013-10-10T02:48:57.143 に答える