我坚持这种方法。
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。我的方法一直出现错误。我究竟做错了什么?任何帮助,将不胜感激。拜托,谢谢你。
答案 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);
}
}
但这可能是最重要的!