Как вы (обойти) динамическое именование переменных? - PullRequest
1 голос
/ 24 августа 2011

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

Допустим, у меня есть массив (вектор) с именем main из 1000 случайных лет между 1980 и 2000 годами, и я хочу сделать из него 20 отдельных массивов (векторов). Эти массивы будут именоваться array1980, array1981 и т. Д., Также будут иметь длину 1000, но будут содержать 1 с, где индекс в имени был равен соответствующему элементу в main и 0 в другом месте. Другими словами:

for(int i=0; i<1000; i++){
    if(main[i]==1980){
       array1980[i]=1;
    } else {
       array1980[i]=0;
    }

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

String("array"+ j)=... # returns an error

В настоящее время я больше всего использую Matlab, но я также немного разбираюсь в Java, c ++ и python, и я пытаюсь понять, как люди решают эту проблему в целом. В идеале я хотел бы иметь возможность манипулировать отдельными переменными (или подмассивами) таким образом, чтобы год оставался в имени переменной (или индекса массива), чтобы уменьшить вероятность ошибки и упростить работу в общем.

Буду признателен за любую помощь.

Ответы [ 3 ]

3 голосов
/ 24 августа 2011
boolean main[][] = new boolean[1000][20];
for (int i=0; i < 1000; i++) {
    array[i][main[i]-1980] = true;
}

Во многих случаях карта будет хорошим решением, но здесь вы можете использовать 2-мерный массив логических значений, так как размер известен до (0-20) и непрерывный, и числовой.

Некоторые языки будут инициализировать массив логических значений как false для каждого элемента, поэтому вам просто нужно установить значения true, на которые указывает main[i].

, так как main[i] возвращает числа с 1980 по 2000, 1980-main[i] вернет 1980-1980 = от 0 до 2000-1980 = 20.Чтобы найти свои значения, вы, конечно, должны добавить 1980 ко второму индексу.

2 голосов
/ 24 августа 2011

Общее решение этого вопроса - не создавать переменные с динамическими именами, а вместо этого создавать карту. Как именно это будет сделано, зависит от языка.

Для Java стоит посмотреть раздел карты учебника коллекций Sun для начала.

1 голос
/ 24 августа 2011

Ответ Дона Роби правильный, но я бы хотел его завершить.

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

Map<Integer,ArrayList<Integer>> yearMap = new HashMap<Integer,ArrayList<Integer>>();
yearMap.put(1980,new ArrayList<Integer>());
for (int i = 0; i < 1000; i++){
    yearMap.get(1980).add(0);
}
yearMap.get(1980).set(999,1);
System.out.println(yearMap.get(1980).get(999));

Но, возможно, есть лучший способ решить эту проблему. Вы не должны спрашивать, как использовать X, чтобы решить Y, но как решить Y.

Итак, что же вы пытаетесь решить?

...