Типы данных на лету - PullRequest
       18

Типы данных на лету

1 голос
/ 29 января 2011

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

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

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

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

Есть ли более простой способ решения этой проблемы? Если есть, я бы очень признателен за понимание. И если нет, как я могу сделать то, что я описал выше?

Чтобы уточнить, я пишу эту программу на Java, и нет, это не домашнее задание.

Спасибо большое.

Ответы [ 3 ]

2 голосов
/ 29 января 2011

Вы можете сделать это с 2D-массивом (который является массивом массивов). Это первоначальное объявление может быть:

int[][]  array;

Когда вы знаете, сколько подмассивов вам понадобится, вы можете создать массив с одним известным измерением:

array = new int[8][];

Вы создали массив, который может содержать 8 подмассивов типа int [], но подмассивы еще не существуют. Чтобы создать его, вы можете сделать это:

array[0] = new int[15];
array[1] = new int[12];
// etc.

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

0 голосов
/ 29 января 2011

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

List<Integer> ints = new ArrayList<Integer>();
for(int i=0;i<128;i++) ints.add(i);

int subLists = 8;
int subListSize = (ints.size() + subLists - 1) / subLists;
List<List<Integer>> intsList = new ArrayList<List<Integer>>();
for(int i = 0; i < ints.size(); i += subListSize)
  intsList.add(ints.subList(i, Math.max(i+subListSize, ints.size())));
0 голосов
/ 29 января 2011

Вы описываете рекурсивную функцию .

Кроме того, если вы хотите что-то вроде int [], но не знаете размер в время инициализации ,ArrayList позволит вам .add () любое количество объектов Integer.

Обратите внимание, что вы сказали время компиляции , а я сказал время инициализации .Вам не нужно жестко кодировать длину массива во время компиляции.Его можно инициализировать с помощью такой переменной:

int[] items = new int[x]();
...