Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将唯一点映射到唯一整数索引_Java_Arrays_Algorithm_Coordinates - Fatal编程技术网

Java 将唯一点映射到唯一整数索引

Java 将唯一点映射到唯一整数索引,java,arrays,algorithm,coordinates,Java,Arrays,Algorithm,Coordinates,我不熟悉坐标系,也不熟悉处理这些问题的数学。我想做的是取一个点(x,y),在一维数组中找到它的位置,这样它就可以如下所示: (0,2)->0 (1,2)->1 (2,2)->2 (0,1)->4 (1,1)->5 (2,1)->6 (0,0)->8 (1,0)->9 (2,0)->10 箭头显示坐标应映射到的值的位置。请注意,每行之后都会跳过一个索引。我想这最终会是一个相当琐碎的解决方案,但我找不到任何类似的问题,我自己也没有想到什么好主意

我不熟悉坐标系,也不熟悉处理这些问题的数学。我想做的是取一个点(x,y),在一维数组中找到它的位置,这样它就可以如下所示:

(0,2)->0 (1,2)->1 (2,2)->2
(0,1)->4 (1,1)->5 (2,1)->6
(0,0)->8 (1,0)->9 (2,0)->10
箭头显示坐标应映射到的值的位置。请注意,每行之后都会跳过一个索引。我想这最终会是一个相当琐碎的解决方案,但我找不到任何类似的问题,我自己也没有想到什么好主意。我知道二维数组的宽度和高度。谢谢你的帮助


抱歉,我的问题可能模棱两可或使用了错误的术语


我知道坐标(0,0)将是左下角的位置。我还知道左上角的坐标应该放在索引0处。每一新行跳过一个索引1。坐标系的大小各不相同,但我知道行数和列数。

如果要减小尺寸并避免重叠,则需要空间填充曲线,例如morton曲线。您的示例看起来像一条peano曲线,因为它是一个3x3矩阵。这些曲线很难计算,但有一些好东西。但如果你只是寻找自我回避曲线,你可以创建自己的曲线吗?阅读此处:。

如果要减小尺寸并避免重叠,则需要空间填充曲线,例如莫顿曲线。您的示例看起来像一条peano曲线,因为它是一个3x3矩阵。这些曲线很难计算,但有一些好东西。但如果你只是寻找自我回避曲线,你可以创建自己的曲线吗?请阅读此处:。

第一步,将数值倒置,保持点位圆滑:

(0,2)->8 (1,2)->9 (2,2)->10
(0,1)->4 (1,1)->5 (2,1)->6
(0,0)->0 (1,0)->1 (2,0)->2
您会注意到,
y
对输出的影响系数为4,
x
对输出的影响系数为1

因此,我们得到一个非常简单的
4y+x


现在回到原始状态,您会注意到转换是
(x,y)第一步,将值倒置,保持点的圆滑:

(0,2)->8 (1,2)->9 (2,2)->10
(0,1)->4 (1,1)->5 (2,1)->6
(0,0)->0 (1,0)->1 (2,0)->2
您会注意到,
y
对输出的影响系数为4,
x
对输出的影响系数为1

因此,我们得到一个非常简单的
4y+x


现在回到原始,你会注意到转换是
(x,y)我被打败了,这里是使用地图的暴力力量

public class MapPointToIndex {
private Map<Point, Integer> map;
private int index, rowcount;

public MapPointToIndex(int rows, int columns) {
    map = new HashMap<Point, Integer>();
    for (int i = rows - 1; i >= 0; i--) {
        index += rowcount;
        for (int j = 0; j < columns; j++) {
            Point p = new Point(j, i);
            map.put(p, index);
            index++;
        }
        rowcount = 1;
    }
}

public int getIndex(Point point){
    return map.get(point);
}

public static void main(String[] args) {
    MapPointToIndex one = new MapPointToIndex(3, 3);
    System.out.println(one.map);

}
}

我被公式打败了,这是使用地图的蛮力

public class MapPointToIndex {
private Map<Point, Integer> map;
private int index, rowcount;

public MapPointToIndex(int rows, int columns) {
    map = new HashMap<Point, Integer>();
    for (int i = rows - 1; i >= 0; i--) {
        index += rowcount;
        for (int j = 0; j < columns; j++) {
            Point p = new Point(j, i);
            map.put(p, index);
            index++;
        }
        rowcount = 1;
    }
}

public int getIndex(Point point){
    return map.get(point);
}

public static void main(String[] args) {
    MapPointToIndex one = new MapPointToIndex(3, 3);
    System.out.println(one.map);

}
}


映射通常需要一个映射。您可以使用
Map
@Dukeling:canbeen。我还没有真正理解这个问题……不要认为映射是必要的,他需要知道映射在数学上是如何发生的(获取一个函数),映射更多的是用于存储(如果必要的话),他只需要索引。操作:索引7和3发生了什么?似乎您需要一个映射以下内容的通用函数:
(0,n-1)->0,(1,n-1)->1,…(n-1,n-1)->n-1,(0,n-2)->n+1,(1,n-2)->n+2,
。这是正确的吗?(在您的示例中n=3)@arynaq这是表示字符值的映射坐标点,所以我有那些保存toString()方法换行符的索引映射通常需要一个映射。您可以使用
Map
@Dukeling:canbeen。我还没有真正理解这个问题……不要认为映射是必要的,他需要知道映射在数学上是如何发生的(获取一个函数),映射更多的是用于存储(如果必要的话),他只需要索引。操作:索引7和3发生了什么?似乎您需要一个映射以下内容的通用函数:
(0,n-1)->0,(1,n-1)->1,…(n-1,n-1)->n-1,(0,n-2)->n+1,(1,n-2)->n+2,
。这是正确的吗?(在您的示例中,n=3)@arynaq这是表示字符值的映射坐标点,所以我的索引包含toString()方法的换行符,这太复杂了。这些数字有一个很好的模式。我更正了我的答案。这是关于减少尺寸和不重叠的曲线。当然,他可以使用任何自回避曲线?莫顿代码是一种专业的方法,特别是对于具有高效存储使用的大量节点。那你就不需要地图了。嗯,你把事情搞得太复杂了。这些数字有一个很好的模式。我更正了我的答案。这是关于减少尺寸和不重叠的曲线。当然,他可以使用任何自回避曲线?莫顿代码是一种专业的方法,特别是对于具有高效存储使用的大量节点。那你就不需要地图了。当然,谢谢!一开始我没有想过把问题颠倒过来,让它更直观。我没有看到巨大的差距,但我的回答是这样的。当然,谢谢!起初,我没有想过把问题颠倒过来,让它更直观一些。我没有看到巨大的差距,但我的答案是这样的。