Java I';我试图了解如何使用二维阵列

Java I';我试图了解如何使用二维阵列,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我有一个CSV文件,几乎有65000行,分为3个值(经度、纬度和海拔)。我要做的是创建一个数组[],它是经度加纬度。经度和纬度是双倍的,它们不能用于索引,但不知道如何将它们映射到索引。所以我想应该是这样的: array[0][0] = altitude_value[0]; array[0][1] = altitude_value[1]; · · · array[i][j] = altitude_value[z]; arra

我有一个CSV文件,几乎有65000行,分为3个值(经度、纬度和海拔)。我要做的是创建一个数组[],它是经度加纬度。经度和纬度是双倍的,它们不能用于索引,但不知道如何将它们映射到索引。所以我想应该是这样的:

array[0][0] = altitude_value[0];
array[0][1] = altitude_value[1];
            ·
            ·
            ·
array[i][j] = altitude_value[z];
array[0][0] = longitude[0];
array[0][1] = latitude[0];
array[0][2] = altitude[0];
array[1][0] = longitude[1];
array[1][1] = latitude[1];
array[1][2] = altitude[1];
...
array[n][0] = longitude[n];
array[n][1] = latitude[n];
array[n][2] = altitude[n];
0, 0 -> a0
0, 0.25 -> a1
...
0.25, 0 -> a5
...
这些值如下所示:

-179.75,-89.75,-1965
-179.75,-89.5,-2011
-179.75,-89.25,-2140
-179.75,-89,-2162
我试图通过以下方法获得基于经度和纬度参数的高度:

public double getAltitude(double longitude, double latitude) {
    return array[array.indexOf(longitude)][array.indexOf(latitude)] = altitude_value;
}

如果您坚持使用二维数组,则可以如下映射值:

array[0][0] = altitude_value[0];
array[0][1] = altitude_value[1];
            ·
            ·
            ·
array[i][j] = altitude_value[z];
array[0][0] = longitude[0];
array[0][1] = latitude[0];
array[0][2] = altitude[0];
array[1][0] = longitude[1];
array[1][1] = latitude[1];
array[1][2] = altitude[1];
...
array[n][0] = longitude[n];
array[n][1] = latitude[n];
array[n][2] = altitude[n];
0, 0 -> a0
0, 0.25 -> a1
...
0.25, 0 -> a5
...
更好的解决方案是创建一个
Position
类来保存一个经度、纬度和高度。然后,您可以拥有一个1D数组,其中包含
Position
实例

编辑以添加:

这里有一个简单的例子。我用你的四条位置线作为输入

-179.75,-89.75,-1965
-179.75,-89.5,-2011
-179.75,-89.25,-2140
-179.75,-89,-2162
我收到了以下经度-179.75,纬度-89.5的输出

-2011
我在我创建的一维数组中使用了一个简单的线性搜索。对于4个值,它足够快。对于65000个值,您可以运行我的代码并查看需要多长时间。正如我所说的,如果您按经度、纬度对数组排序并使用二进制搜索,您将在大约32个测试中得到正确的结果

这是我使用的完整的可运行代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PositionApp {

    public static void main(String[] args) {
        new PositionApp().run();
    }
    
    private Position[] positions;
    
    public void run() {
        try {
            int count = readCSVFile();
            this.positions = new Position[count];
            processCSVFile();
            int altitude = getAltitude(-179.75, -89.5);
            System.out.println(altitude);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public int readCSVFile() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                getClass().getResourceAsStream("/sample.csv")));
        int count = 0;
        String line = reader.readLine();
        while (line != null) {
            count++;
            line = reader.readLine();
        }
        reader.close();
        return count;
    }
    
    public void processCSVFile() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                getClass().getResourceAsStream("/sample.csv")));
        int count = 0;
        String line = reader.readLine();
        while (line != null) {
            String[] parts = line.split(",");
            double longitude = Double.valueOf(parts[0]);
            double latitude = Double.valueOf(parts[1]);
            int altitude = Integer.valueOf(parts[2]);
            positions[count++] = new Position(longitude, latitude, altitude);
            line = reader.readLine();
        }
        reader.close();
    }
    
    public int getAltitude(double longitude, double latitude) {
        for (int index = 0; index < positions.length; index++) {
            if ((positions[index].getLongitude() == longitude) &&
                (positions[index].getLatitude() == latitude)) {
                return positions[index].getAltitude();
            }
        }
        return Integer.MIN_VALUE;
    }
    
    public class Position {
        
        private final int altitude;
        
        private final double longitude;
        private final double latitude;
        
        public Position(double longitude, double latitude, int altitude) {
            this.longitude = longitude;
            this.latitude = latitude;
            this.altitude = altitude;
        }

        public int getAltitude() {
            return altitude;
        }

        public double getLongitude() {
            return longitude;
        }

        public double getLatitude() {
            return latitude;
        }
        
    }

}
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
公共类应用程序{
公共静态void main(字符串[]args){
新建PositionApp().run();
}
私人职位[]职位;
公开募捐{
试一试{
int count=readCSVFile();
this.positions=新位置[计数];
processCSVFile();
内部高度=getAltitude(-179.75,-89.5);
系统输出打印LN(高度);
}捕获(IOE异常){
e、 printStackTrace();
}
}
public int readCSVFile()引发IOException{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
getClass().getResourceAsStream(“/sample.csv”);
整数计数=0;
字符串行=reader.readLine();
while(行!=null){
计数++;
line=reader.readLine();
}
reader.close();
返回计数;
}
public void processCSVFile()引发IOException{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
getClass().getResourceAsStream(“/sample.csv”);
整数计数=0;
字符串行=reader.readLine();
while(行!=null){
String[]parts=line.split(“,”);
双经度=double.valueOf(部分[0]);
双纬度=double.valueOf(零件[1]);
int高度=整数值(零件[2]);
位置[计数+]=新位置(经度、纬度、高度);
line=reader.readLine();
}
reader.close();
}
公共高度(双经度、双纬度){
对于(int index=0;index
为了简单起见,假设经度和纬度为0-1,增量为0.25(
n=5
增量)。那么您的映射将如下所示:

array[0][0] = altitude_value[0];
array[0][1] = altitude_value[1];
            ·
            ·
            ·
array[i][j] = altitude_value[z];
array[0][0] = longitude[0];
array[0][1] = latitude[0];
array[0][2] = altitude[0];
array[1][0] = longitude[1];
array[1][1] = latitude[1];
array[1][2] = altitude[1];
...
array[n][0] = longitude[n];
array[n][1] = latitude[n];
array[n][2] = altitude[n];
0, 0 -> a0
0, 0.25 -> a1
...
0.25, 0 -> a5
...
然后,您可以使用由
[经度*4][纬度*4]
为任何经度和纬度值确定的索引
[x][y]
访问海拔高度


显然,对于您的实际示例,在查询数组时需要将经度和纬度值偏移为零,但这不应该是太多额外的工作。

Java基元数组没有“indexOf”方法,如提供的getAltitude方法中所示。您需要将其强制转换为列表,或者使用帮助器类(如java.util.Array)来获得该功能

看看您如何尝试使用数组索引,您最好使用另一种数据类型,例如Map of Maps。这些其他数据类型的基本功能在概念上与2D数组的工作原理相同,但与基本数组相比,允许使用更多种类的索引数据类型

使用地图地图的基本实现:



Map为什么在get方法中设置值?删除
=altitude\u值
partUnrelated,但是如果有任何重复的lat/long值,它可能不会执行您想要的操作。@azro这是一个假设的方法,但我正在尝试以类似的方式实现数组that@DaveNewton有很多复制品,为什么它不能工作呢?你可能想考虑使用<代码>地图>代码>而不是数组。我认为OP实际上是想构造一个从纬度/经度对到海拔高度的地图,而不是把它们全部存储在一个数组中。@亨利·吐温:是的,但是OP说他不允许使用地图。一旦创建了数组,就可以通过二进制搜索对其进行排序并找到高度。@GilbertLeBlanc您能帮我做一下吗?你会用for循环吗?