Автоматическое создание массивов в цикле - PullRequest
1 голос
/ 12 февраля 2012

РЕДАКТИРОВАТЬ: это необходимо для серии 1d массивов. Можно использовать 2d Arrays / Arraylists, но конечный результат должен быть в серии 1d Arrays. Помещение этого в 2d структуру просто оставит меня с той же проблемой. (преобразование каждой строки двумерного массива / списка в отдельный массив с первоначальным именем (в идеале последовательные целые числа после некоторой строки, такой как Arr0, Arr1 ...., как показано в примере).

Я ищу код для автоматически генерируемых массивов (того же типа; int [])

Надеемся, что приведенный ниже код показывает, что я пытаюсь выполнить:

for(int i=0; i<1000; i++) {
    int[] Arr"i" = new int[(200)];
    for(int j=0; j<200; j++) {
        Arr"i"[j] = j;
    }
}

В итоге у меня будет 1000 массивов с именами Arr0, Arr1, Arr2 ..... Arr999, и каждый из них будет заполнен значениями 0-199 в соответствующем индексе.

(все они будут иметь разные данные, это простой пример для отображения моей проблемы).

Есть ли способ сделать это? Я все еще довольно новичок в Java, и, кажется, любое возможное решение сделать это, так сказать, немного из моей лиги.

Спасибо за любую помощь

Ответы [ 5 ]

3 голосов
/ 12 февраля 2012

Похоже, что вам действительно нужно, это Карта :

Map<String, int[]> map = new HashMap<String, int[]>();

for(int i=0; i<1000; i++) {
    int[] arr = new int[200];
    for(int j=0; j<200; j++) {
        arr[j] = j;
    }
    map.put("Arr" + i, arr);
}

Для доступа к значениям (в данном случае int -arrays) вы используете map.get(<key>), например map.get("Arr10")

2 голосов
/ 12 февраля 2012

В Java нет способа создавать такие переменные во время выполнения.Они должны быть названы заранее во время компиляции.Таким образом, вы не можете принять тот подход, с которого начинали.При этом у вас, безусловно, есть правильная идея - создать массив, состоящий из массивов в каждом слоте.

Как уже говорили другие, вы ищете 2-мерный массив.Фразируя это по-другому, вы ищете массив массивов.Вы можете представить одномерный массив как набор отдельных слотов, каждый из которых может хранить в себе одно значение.2D-массив - это место, где каждый отдельный слот содержит в себе другой массив.

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

  1. Выделить новый массив в i-м слоте (с соответствующим размером для этого массива)
  2. Создать цикл for (от 0 -> размер нового массива)
  3. Добавление новых значений в i-е по j-му значению (Arr [i] [k] = x)

Более подробное объяснение можно найти здесь который предоставляет очень полезное изображение для изображения того, как выглядит массив массивов, а также некоторые примеры кода.

Читая ваши изменения, кажется, что вы хотите, чтобы они назывались как отдельные одномерные массивы.Несмотря на то, что невозможно назвать новые переменные во время выполнения таким образом, вы можете просматривать каждый массив в 2D-массиве как отдельную строку.

Я предлагаю посмотреть, можете ли вы реорганизовать свой код, чтобы получить метод, который будет принимать одномерный массив и выполнять любую необходимую вам обработку.

Сначала метод обработки массива 1D:

/**
 * Prints each value x^2 in the given row
 */
private static void processRow(int[] row) {
    for (int x : row) {
        System.out.println("x^2 = " + (x*x));
    }
}

Как только вы это сделаете, вы можете обработать отдельную строку в вашем 2D-массиве следующим образом:

public static void main(String[] args) {
    int[][] table = new int[10][10];

    // Allocate table with real values

    for (int[] row : table) {
        processRow(row);
    }
}
2 голосов
/ 12 февраля 2012

Лучшее, что можно сделать здесь, вероятно, будет ArrayList из int[] с. Затем вы можете добавить новый, когда захотите.

Это будет выглядеть так:

ArrayList<int[]> arrs = new ArrayList<int[]>();
for(int i = 0; i < 1000; i++) {
  arrs.add(new int[200]);
  for(int j = 0; j < 200; j++) {
    arrs.get(i)[j] = j;
  }
}

Вот ссылка на ArrayList.

0 голосов
/ 12 февраля 2012

Вот подход, отличный от того, что было предоставлено большинством ответов.Вы можете использовать скрипт (например, Bash) для генерации Java-файла, который вы ищете.Я написал один очень быстро, который делает именно то, что вам нужно:

#!/bin/bash

file="./ArrayGen.java";

echo "public class ArrayGen {" >> $file;

echo "public static void main(String[] args) {" >> $file;

for a in {0..999}
do

    echo "int[] arr$a = new int[200];" >> $file;

done

echo "} }" >> $file;

exit 0;
0 голосов
/ 12 февраля 2012

Вы хотите использовать для этого 2-мерный массив.

Вы можете создать 2-мерный массив следующим образом:

int[][] arr = new int[1000][200];
// iterates over the 1000 of first dimension
for(int i = 0; i < arr.length; i++) {

    // iterates over the 200 of the second dimension
    for(int j = 0; j < arr[i].length; j++) {
        // insert values into array here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...