Однако я не знаю, понадобится ли мне 10, 8 или 12 классов или любое другое количество, если уж на то пошло.
Я не узнаю до выполнения.
Могу ли я изменять количество элементов в массиве "на лету"? Если да, то как?
Переведено автоматически
Ответ 1
Нет, вы не можете изменить размер массива после его создания. Вам либо придется выделить его больше, чем, по вашему мнению, вам понадобится, либо принять накладные расходы, связанные с перераспределением, для увеличения которого он должен увеличиваться в размерах. Когда это произойдет, вам придется выделить новый массив и скопировать данные из старого в новый:
int[] oldItems = newint[10]; for (inti=0; i < 10; i++) { oldItems[i] = i + 10; } int[] newItems = newint[20]; System.arraycopy(oldItems, 0, newItems, 0, 10); oldItems = newItems;
Если вы окажетесь в такой ситуации, я бы настоятельно рекомендовал вместо этого использовать коллекции Java. В частности, ArrayList по сути, оборачивает массив и заботится о логике увеличения массива по мере необходимости.:
Обычно ArrayList в любом случае является предпочтительным решением для массива по нескольким причинам. Во-первых, массивы изменяемы. Если у вас есть класс, который делает это:
classMyclass { privateint[] items;
publicint[] getItems() { return items; } }
вы создали проблему, поскольку вызывающий объект может изменить ваш личный элемент данных, что приводит ко всевозможным защитным копиям. Сравните это с версией списка:
classMyclass { private List<Integer> items;
public List<Integer> getItems() { return Collections.unmodifiableList(items); } }
Ответ 2
В java длина массива фиксирована.
Вы можете использовать список для хранения значений и вызвать toArray метод, если это необходимо, Смотрите следующий пример:
publicstaticvoidmain( String [] args ) { // dynamically hold the instances List<xClass> list = newArrayList<xClass>();
// fill it with a random number between 0 and 100 intelements=newRandom().nextInt(100); for( inti=0 ; i < elements ; i++ ) { list.add( newxClass() ); }
// convert it to array xClass [] array = list.toArray( newxClass[ list.size() ] );
Как уже говорили другие, вы не можете изменить размер существующего массива Java.
ArrayList - это самое близкое, что есть в стандартной Java, к массиву динамического размера. Однако в ArrayList (фактически интерфейсе списка) есть некоторые вещи, которые не "похожи на массив". Например:
Вы не можете использовать [ ... ] для индексации списка. Вы должны использовать методы get(int) и set(int, E).
Список массивов создается с нулевыми элементами. Вы не можете просто создать список массивов из 20 элементов, а затем вызвать set(15, foo).
Вы не можете напрямую изменять размер ArrayList. Вы делаете это косвенно, используя различные методы add, insert и remove.
Если вы хотите что-то более похожее на массив, вам нужно будет разработать свой собственный API. (Возможно, кто-то мог бы подключить существующую стороннюю библиотеку... Я не смог найти ни одного за 2 минуты "исследования" с помощью Google :-))
Если вам действительно нужен только массив, который растет по мере его инициализации, то решение примерно такое.
ArrayList<T> tmp = newArrayList<T>(); while (...) { tmp.add(newT(...)); } // This creates a new array and copies the element of 'tmp' to it. T[] array = tmp.toArray(newT[tmp.size()]);
Ответ 4
Вы устанавливаете количество элементов на любое желаемое значение во время его создания:
xClass[] mysclass = newxClass[n];
Затем вы можете инициализировать элементы в цикле. Я предполагаю, что это то, что вам нужно.
Если вам нужно добавить или удалить элементы в массив после его создания, то вам придется использовать ArrayList.