声明多维数组并为其赋值的正确方法是什么?
这就是我所拥有的:
int x = 5;
int y = 5;
String[][] myStringArray = new String [x][y];
myStringArray[0][x] = "a string";
myStringArray[0][y] = "another string";
Run Code Online (Sandbox Code Playgroud) 我正在做一些反思工作并且遇到一个小问题.
我正在尝试将对象打印到某个GUI树,并且以通用方式检测数组有问题.
我建议:
对象instanceof Iterable
会成功,但事实并非如此(显然只适用于Lists和Set以及任何实现它的人.)
因此,如何是我会recognice数组一些Object[],或者long[]还是Long[]......?
谢谢
假设我们有Java代码:
Object arr = Array.newInstance(Array.class, 5);
Run Code Online (Sandbox Code Playgroud)
那会跑吗?作为进一步的说明,如果我们尝试这样的事情怎么办:
Object arr1 = Array.newInstance(Array.class, 2);
Object arr2 = Array.newInstance(String.class, 4);
Object arr3 = Array.newInstance(String.class, 4);
Array.set(arr1, 0, arr2);
Array.set(arr1, 1, arr3);
Run Code Online (Sandbox Code Playgroud)
那么arr1会是一个2D数组,相当于:
String[2][4] arr1;
Run Code Online (Sandbox Code Playgroud)
怎么样:如果我们在运行时之前不知道这个数组的尺寸怎么办?
编辑:如果这有帮助(我相信它会...)我们试图从表单的字符串解析未知维度的数组
[value1, value2, ...]
Run Code Online (Sandbox Code Playgroud)
要么
[ [value11, value12, ...] [value21, value22, ...] ...]
Run Code Online (Sandbox Code Playgroud)
等等
编辑2:如果有人像我一样愚蠢尝试这个垃圾,这里是一个至少编译和运行的版本.逻辑是否合理完全是另一个问题......
Object arr1 = Array.newInstance(Object.class, x);
Object arr11 = Array.newInstance(Object.class, y);
Object arr12 = Array.newInstance(Object.class, y);
...
Object arr1x = Array.newInstance(Object.class, y);
Array.set(arr1, 0, arr11);
Array.set(arr1, 1, arr12);
...
Array.set(arr1, x-1, arr1x);
Run Code Online (Sandbox Code Playgroud)
等等.它只需要是一个巨大的嵌套对象数组
我想知道是否知道如何使用反射获得数组对象的大小?
我有一个车辆组件包含类型为Car的数组对象.
Vehicles.java
public class Vehicles{
private Car[] cars;
// Getter and Setters
}
Run Code Online (Sandbox Code Playgroud)
Car.java
public class Car{
private String type;
private String make;
private String model;
// Getter and Setters
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用Java Reflection 在车辆组件中获得汽车阵列的大小?
我目前有以下内容:
final Field[] fields = vehicles.getClass().getDeclaredFields();
if(fields.length != 0){
for(Field field : fields){
if(field.getType().isArray()){
System.out.println("Array of: " + field.getType());
System.out.println(" Length: " + Array.getLength(field.getType()));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
java.lang.IllegalArgumentException: Argument is not an array
at java.lang.reflect.Array.getLength(Native Method) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个函数来在Java中对两个数组(不一定大小相等)求和并返回结果.
这是我的尝试:
public static <T> T[] sumArrays(T[] lhs, T[] rhs)
{
T[] out = new T[Math.max(lhs.length, rhs.length)];
for (int i = 0; i < Math.max(lhs.length, rhs.length); ++i){
if (i < Math.min(lhs.length, rhs.length)){
out[i] = lhs[i] + rhs[i];
} else if (i < lhs.length){
out[i] = lhs[i];
} else /* if (i < rhs.length)*/{
out[i] = rhs[i];
}
}
return out;
}
Run Code Online (Sandbox Code Playgroud)
但是我有几个观察结果,尽管有编译错误.
为什么这个函数不在Java库中,这在极端情况下是巨大的?
我有动力使用泛型,因为你会在C++中使用模板.
我担心得到输入数据的深层副本; lhs和``rhs.任何人都可以向我保证吗?C++允许我传递一个常量引用; 我肯定知道.
T[]对于泛型类型,out的实例化似乎是非法的.我错过了什么?
编译器会优化我的重复Math.max(lhs.length, rhs.length)吗?
编译器不喜欢lhs[i] + rhs[i].大概是因为它不知道T的类型,但是C++允许你这样做,因为在它知道类型之前它不会尝试编译模板.
返回时是否会拿出一份深刻的副本?同样,C++编译器也不需要额外的副本. …