Java 如何为给定坐标找到正确的邻居?

Java 如何为给定坐标找到正确的邻居?,java,algorithm,coordinates,Java,Algorithm,Coordinates,更新:这个问题是关于如何获得任何给定坐标的一组邻居的指导 我创建了一个包含坐标的二维数组 int[][] coordinates= { { -1, -1 }, { -1, 0 }, { -1, +1 }, { 0, -1 }, { 0, +1 }, { +1, -1 }, { +1, 0 }, { +1, -1 } }; 可以看出,这些是坐标(0,0)的邻域 现在,我尝试实现一种方法,该方法采用两个参数(int positionX,int positionY),并使用

更新:这个问题是关于如何获得任何给定坐标的一组邻居的指导

我创建了一个包含坐标的二维数组

 int[][] coordinates= { { -1, -1 }, { -1, 0 }, { -1, +1 },
            { 0, -1 }, { 0, +1 }, { +1, -1 }, { +1, 0 }, { +1, -1 } };
可以看出,这些是坐标(0,0)的邻域

现在,我尝试实现一种方法,该方法采用两个参数
(int positionX,int positionY)
,并使用输入参数值coordiante(x,y)作为起始坐标,并查找该坐标的所有邻居

我在想这样的事情:

    int getNearCoordinates(int positionX, int positionY) {

        for (int[] coordinate: coordinates) {
               //I am not sure what to do after this
        }

    } 
/** @return a collection of eight nearest coordinates near origin */
Collection<Coordinate> getNearCoordinates(Coordinate origin) {
    Collection<Coordinate> neighbours = new ArrayList<>();

    for (Coordinate direction : coordinates)
        neighbours.add(origin.move(direction));

    return neighbours;
}
我试图使用一个循环从我创建的2d数组中获取单个坐标,我被困在这里了。我如何找到合适的方法找到positionX和positionY的邻居

什么是邻居?

下图中的所有橙色点都是原点的邻域
(0,0)
如果此表达式为真,则两个点A(x1,y1)B(x2,y2)是相邻点:

 Math.abs(x1-x2) <= 1 && Math.abs(y1-y2) <= 1 
Math.abs(x1-x2)我建议

  • 使用专用的类(
    坐标
    ),而不是
    int[]
    。这使您的代码更容易扩展(第三维等)或更改(使用
    double
    而不是
    int
    等)。在本例中,您可以看到一个imutable类-这会妨碍代码产生副作用
  • 使用
    集合
    而不是
    数组
    。这使得处理变得更加容易(您可以简单地
    添加
    删除
    项)
  • 使用java8流式API。它的速度非常快,使您的代码可读性更好
其他想法:

  • 甚至可以将
    getNearCoordinates
    作为坐标类的一部分。这将使
    新坐标(27,35).getNearCoordinates()可用
  • 除了在单独的字段中存储
    x
    y
    之外,您还可以使用
    映射
    。这会使您的代码更难理解,但会减少重复的代码

  • 您还可以使用两个嵌套循环
    for(int x=-1;x)生成方向集合,这取决于您如何定义相邻对象。下面的代码将测试坐标,并为对角线以及水平和垂直相邻对象返回true

    if (Math.abs(coordinate[0] - positionX) <= 1 && Math.abs(coordinate[1] - positionY) <= 1)
    {
        System.out.println(Arrays.toString(coordinate));
    }
    
    if(Math.abs(坐标[0]-positionX)这不是实现它的最佳方式(使用int[]表示点),这个答案的目的是展示算法

    如果您谈论的是一个无界平面,那么您将始终有8个点,因此您可以通过以下方式实现它:

    // first point index, 2nd: 0 = x, 1 = y
    public int[][] getNeighbours(int x, int y) {
       int[][] ret = new int[8][2];
       int count = 0;
       for (int i = -1; i <= 1; i++)
          for (int j = -1; j <= 1; j++) {
             if (i == 0 && j == 0)
                continue;
             ret[count][0] = x + i;
             ret[count++][1] = y + j;
          }
       return ret;
    }
    
    //第一个点索引,第二个:0=x,1=y
    公共int[][]获取邻居(int x,int y){
    int[]ret=新int[8][2];
    整数计数=0;
    
    对于(int i=-1;i这似乎很明显,但您可以复制
    坐标
    ,并将给定坐标的x和y值添加到每个坐标的x和y值,例如使用for循环进行拟合。

    是否要计算两个坐标的距离(返回
    int
    )或者,您希望将一组邻居设置为一个坐标(返回八个坐标)?@slartidan我想得到一组邻居。这是一个算法问题吗?也就是说,我如何才能以最佳的时间复杂度或空间复杂度做到这一点?如果是这样的话,我们暂时不要用Java来掩盖这个问题。OTOH,如果你已经有了一个算法,只需要用Java来帮助编码,请发布你想要使用的算法。我不清楚具体是什么你想要什么。你想生成一组8个坐标,它们是你输入的点的邻域吗?或者我们正在尝试确定已知坐标集中的哪一个是你输入的点的邻域吗?或者其他什么?@ErickG.Hagstrom我想获得一组任意给定坐标的邻域。很抱歉,不清楚,我将更新m我很喜欢这个答案,但是我不允许在这个作业中使用Java8,只允许使用Java7@HashMap我添加了一个“非Java8”实现我有一个问题,
    getNearCoordinates
    方法返回一个类型为
    Coordinate
    的集合,如果我想得到这些坐标的精确值,我应该怎么做?例如,对于(1,1)的坐标,我如何得到所有8个相邻坐标,如下所示:(1,0),(0,0),(2,0),(2,1),(3,1),(2,3),(0,2),(0,1)?请记住,任务是评估邻域集-而不是判断某个坐标是否为邻域。嗨,如果我想排除对角邻域,这个条件是什么?刚才看到,如果你不喜欢
    继续
    ,它可以重写为
    如果(I!=x | | j!=y)ret.add(…)
    嗨,如果我想排除对角邻居,这个条件是什么?
    // first point index, 2nd: 0 = x, 1 = y
    public int[][] getNeighbours(int x, int y) {
       int[][] ret = new int[8][2];
       int count = 0;
       for (int i = -1; i <= 1; i++)
          for (int j = -1; j <= 1; j++) {
             if (i == 0 && j == 0)
                continue;
             ret[count][0] = x + i;
             ret[count++][1] = y + j;
          }
       return ret;
    }
    
    public List<int[]> getNeighbours(int x, int y, int minX, int maxX, int minY, int maxY) {
       List<int[]> ret = new ArrayList<int[]>(8); // default initial capacity is 100
       for (int i = Math.max(x - 1, minX); i <= Math.min(x + 1, maxX); i++)
          for (int j = Math.max(y - 1, minY); j <= Math.min(y + 1, maxY); j++) {
             if (i == x && j == y)
                continue;
             ret.add(new int[] {i, j});
          }
       return ret;
    }