可能的Java For循环问题

时间:2011-04-05 22:31:18

标签: java arrays loops for-loop arraylist

好的,我正在努力将大约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?

4 个答案:

答案 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
    }