繁体   English   中英

Java中的多维数组

[英]Multidimensional Arrays in Java

好的,所以我在职业生涯的大部分时间里一直在使用PHP,发现自己需要使用Java。 就我而言,我最大的问题是用Java创建和操作数组。 PHP中的示例:

   $cars = array(1 => array("stats"=> array("velocity"=>100,
                                        "acceleration"=>0,
                                        "energy"=>30000,
                                        "distance"=>200
                                      )
                      ),
                 2 => array("stats"=> array("velocity"=>3,
                                        "acceleration"=>6,
                                        "energy"=>30000,
                                        "distance"=>200)
                                      )
                      );

我试图在Java中重新创建这种类型的数组,但是在初始化它时遇到了麻烦。 在这种情况下,数组是否视为字符串? 并且在创建数组之前必须设置数组的大小吗? 例如: String[][][] car = new String[][][]

我认为Java没有TRUE多维数组。 a[i][j][k]一样被访问的数组只是数组,数组或数组。

您可以尝试以下构造:

 String[][] car = new String [][] { { "X0", "Y0"},
                                    { "X1", "Y1"},
                                    { "X2", "Y2"},
                                    { "X3", "Y3"},
                                    { "X4", "Y4"} };

就像aet在评论中说的那样-如果您正在考虑使用Java执行此操作-则不要。 你这样做是错的。

你应该上汽车课

public class Car {
   private int velocity;
   private int acceleration;
   private int energy;
   private int distance;
   //getters and setters, a constructor that gets all the property values ...
}

然后将您的汽车存放在一些集合中。 ArrayList是最简单的方法:

List<Car> cars = new ArrayList<Car>();
cars.add(new Car(100,0,30000,200));
cars.add(new Car(3,6,30000,200));

访问汽车列表将如下所示:

cars.get(0).getVelocity(); //collection indexes start at 0

1) "stats"索引是否正确? 如果没有,您可以:

Map<String, Integer>[] cars = new HashMap<String, Integer>[your length here];

这将通过数字索引您的汽车,跳过“统计”索引,并允许您通过字符串索引最后一个整数:

int velocityOfSecondCar = cars[1].get("velocity"); //note indexing from 0

2)如果"stats"索引非常严格,则必须更深入一维

您在PHP中所拥有的通常会表示为Java中的嵌套Map实例。 例如:

HashMap<Integer,Map<String,Map<String,Integer>>> data = new HashMap<>();

然后,您可以通过说出值(假设正确填充了哈希的所有级别):

int velocity = data.get(1).get("stats").get("velocity");

像这样填充嵌套地图可能很复杂,通常在添加数据成员之前,您将使用辅助方法来确保所有“父”级别都已填充。

是的,初始化数组时必须提供长度。 因此,您的数组看起来像这样:

int lenght1=x;
int length2=y;
int lenght3=z;
String[][][] car = new String[lenght1][lenght2][lenght3]

我自己不是PHP开发人员,但是数组中的类将遵循Java在抽象和继承方面实现的OOP规则。 因此,在检索元素时,无论包含它们的类或接口是什么,都可以使用它们对应的接口。

另一方面,如果您在初始化之前不知道数组长度,则可以使用ArrayList类,它几乎就像一个Vector。 如果添加了新元素,则此类会修改其内部长度。 除了ArrayList外,您还可以在Java规范中拥有一套完整的数据结构来存储元素,例如Maps,Sets,Lists等。

实例化ArrayList时,应指定哪个类或接口描述要存储在数据结构中的对象,因此您必须使用泛型实例化该结构。 在您的情况下:

ArrayList<String> dim1=new ArrayList<String>();
ArrayList<ArrayList<String>> dim2=new ArrayList<ArrayList<String>>();
ArrayList<ArrayList<ArrayList<String>>> dim3= new ArrayList<ArrayList<ArrayList<String>>>();

如您所见,此结构比上面的简单数组更性感,但显然需要更多的精力来处理它。 不要忘了在将数组列表放入3d矩阵之前实例化它们,否则以后访问空对象会出现异常。

尝试这个..

    Map<Integer, HashMap<String, HashMap<String, Integer>>> map = new HashMap<>();
    HashMap<String, Integer> hm = new HashMap<>();
    hm.put("Velocity", 1);
    hm.put("acceleration", 2);
    HashMap<String, HashMap<String, Integer>> state1 = new HashMap<>();
    state1.put("state1", hm);
    map.put(1, state1);
    System.out.println(map);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM