Заполнение неинициализированного массива в Java? (или обходной путь!) - PullRequest
2 голосов
/ 29 декабря 2010

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

У меня есть массив, который будет содержать количество вершин в модели (вместе с несколькими другими массивами):

float vertices[];

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

Смогу ли я заполнить его так, как мне нужно?:

vertices[95] = 5.004f; //vertices was defined like the example above

или я должен инициализировать его заранее?

если последнее так, то каков будет хороший способ узнать количество вершин в файле? Как только я читаю его с помощью inputtreamreader.read (), он переходит на следующую строку, пока не прочитает весь файл. Единственное, о чем я могу думать, это прочитать весь файл, посчитать количество вершин, а затем прочесть его снова для заполнения вновь инициализированного массива.

Есть ли способ динамически распределять данные по мере необходимости?

Ответы [ 3 ]

6 голосов
/ 29 декабря 2010

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

   List<Float> vertices = new ArrayList<Float>();

Вы можете добавить значение как это:

   vertices.add(5.0F);

и список будет расти в соответствии с вашими потребностями.

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

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

Вы можете начать читать о коллекциях Java здесь .

1 голос
/ 29 декабря 2010

В Java-массивах нужно инициализировать заранее.В вашем случае у вас есть следующие опции:

1) Используйте ArrayList (или некоторую другую реализацию интерфейса List), как предложено другими.Такие списки могут динамически расти, поэтому это поможет.

2) Если у вас есть контроль над форматом файла, добавьте информацию о количестве вершин в начало файла, чтобы вы могли предварительно инициализировать массив с помощьюправильный размер.

3) Если у вас нет контроля над ним, попробуйте угадать количество вершин на основе размера файла (число с плавающей запятой 4 байта, поэтому, возможно, разделите File.length() на 4, например).Если предполагаемое число слишком мало, вы можете динамически создать больший массив (скажем, 120% от предыдущего размера массива), скопировать все данные из предыдущего массива в новый и продолжить.Это может быть дорогостоящим, но если ваше предположение о размере массива является точным, это не будет проблемой.

Мы могли бы дать вам больше идей, если вы дадите нам больше информации о формате файла и / или как этот массиввершин, которые будут использоваться (например, храниться в течение длительного времени или быстро выбрасывать).

0 голосов
/ 29 декабря 2010

Нет, вы не можете заполнить неинициализированный массив. Если вам нужна динамическая структура, которая позволяет хранить данные + индексы (что кажется важным в вашем случае), я бы выбрал Map (ключом Map будет ваш индекс):

Map<Integer, Float> vertices = new HashMap<Integer, Float>();
vertices.put(95, 5.004f);
...