好的,我正在努力将大约120个左右的特定数组列表添加到数组列表中 (这些只是假设的价值和名称,但概念相同
private ArrayList<int[]> listofNames = new ArrayList<int[]>();
private static int[] NAME_0 = {x, x, x};
private static int[] NAME_1 = {x, x, x};
private static int[] NAME_2 = {x, x, x};
private static int[] NAME_3 = {x, x, x};
有没有办法可以使用for循环来通过NAME_0来说NAME_120?
答案 0 :(得分:12)
你可以使用反射,,但你几乎肯定不应该。
不要在末尾使用带数字的变量,而应该使用数组数组。毕竟,这就是阵列的用途。
private static int[][] NAMES = new int[][]{
{x, x, x},
{x, x, x},
{x, x, x},
{x, x, x},
{x, x, x},
/// etc.
};
如果您只是将这些全部添加到ArrayList,您可能只需使用初始化程序块:
private ArrayList<int[]> listofNames = new ArrayList<int[]>();
{
listofNames.add(new int[]{x, x, x});
listofNames.add(new int[]{x, x, x});
listofNames.add(new int[]{x, x, x});
/// etc.
}
答案 1 :(得分:1)
劳伦斯建议,你可以使用反射
for(int i=0; i<=120; i++)
{
Field f = getClass().getField("NAME_" + i);
f.setAccessible(true);
listofNames.add((int[]) f.get(null));
}
另外劳伦斯建议,还有更好的方法。
答案 2 :(得分:1)
如果你想从你的问题中真正做到,你将不得不使用反射。像这样:
Class cls = getClass();
Field fieldlist[] = cls.getDeclaredFields();
for (Field f : fieldlist) {
if (f.getName().startsWith("NAME_")) {
listofNames.add((int[]) f.get(this));
}
}
答案 3 :(得分:0)
IRL很少,用于数组(或可变数据包,在本质上,不能是线程安全的)。例如,您可以使用以下函数:
public static <T> ArrayList<T> L(T... items) {
ArrayList<T> result = new ArrayList<T>(items.length + 2);
for (int i = 0; i < items.length; i++)
result.add(items[i]);
return result;
}
因此创建一个列表并循环显示它:
ArrayList<ArrayList<Field>> list = L(//
L(x, x, x), //
L(x, x, x), //
L(x, x, x), //
L(x, x, x) // etc.
);
for (int i = 0; i < list.length || 1 < 120; i++) {
}
//or
int i = 0;
for (ArrayList<Field> elem: list) {
if (i++ >= 120) break;
// do else
}