Возможный Java для вопроса о цикле - PullRequest
1 голос
/ 06 апреля 2011

Хорошо, так что я работаю над добавлением списка из примерно 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 ]

12 голосов
/ 06 апреля 2011

Вы можете использовать отражение, , но вы почти наверняка не должны .

Вместо того, чтобы использовать переменные с числами в конце, вы должны вместо этого использовать массив массивов. В конце концов, для этого нужны массивы.

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 голос
/ 06 апреля 2011

Если вы действительно хотите уклониться от своего вопроса, вам придется использовать рефлексию. Примерно так:

Class cls = getClass();
Field fieldlist[] = cls.getDeclaredFields();        
for (Field f : fieldlist) {
    if (f.getName().startsWith("NAME_")) {
        listofNames.add((int[]) f.get(this));
    }
}
1 голос
/ 06 апреля 2011

Вы можете сделать, как предложил Лоуренс, используя отражение

    for(int i=0; i<=120; i++)
    {

        Field f = getClass().getField("NAME_" + i);
        f.setAccessible(true);
        listofNames.add((int[]) f.get(null));
    }

Также, как предполагает Лоуренс, есть лучший способ сделать это.

0 голосов
/ 06 апреля 2011

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
    }
...