Заполнение динамического массива (Java)
Когда пытаюсь в цикле организовать заполнение, то сталкиваюсь с ошибками. Что не так. P.S. чуть ниже закомментированный код с заранее известными данными.
Отслеживать
задан 28 фев 2020 в 6:11
77 1 1 серебряный знак 10 10 бронзовых знаков
«сталкиваюсь с ошибками» — ??
– user176262
28 фев 2020 в 6:15
Во-первых, для «динамичности» лучше использовать списки, а не массивы. Во-вторых, вам нужно разобраться с областями видимости. В-третьих, вы зачем-то на каждой итерации создаёте новый массив, затирая ссылку на старый, вместо его заполнения.
28 фев 2020 в 6:16
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вам необходимо разобраться в динамических массивах.
Например, int[] array = new int[10]; — это статический массив, потому что в нём необходимо задать размер сразу же. В вашем случае происходит переинициализация массива, т.е. сначала создаёте массив, а при новой итерации в цикле for вы опять заново создаёте.
private List x = new ArrayList(); — это уже является динамическим, потому что размерность не задаём, он будет расширяться по мере заполнения данными.
Отслеживать
ответ дан 28 фев 2020 в 6:39
1,375 1 1 золотой знак 17 17 серебряных знаков 37 37 бронзовых знаков
Хорошо. Буду смотреть.
28 фев 2020 в 6:55
Нашел решение, выглядит так:
public static void main(String[] args) < int Weight=0; int Count=0; System.out.println("Введите грузоподъемность рюкзака и нажмите Enter: "); Scanner scan = new Scanner(System.in); Weight = scan.nextInt(); System.out.println("Введите количество вещей и нажмите Enter: "); Count = scan.nextInt(); ArrayListarrayList = new ArrayList<>(); System.out.println("Вводим параметры вещей"); for (int i=1; i <=Count;i++)< System.out.println("Введите через запятую ценность и вес "+i+"-ой вещи и нажмите Enter: "); arrayList.add(scan.next()); >Item[] items = new Item[Count]; for (int i=0;i Main knapsack = new Main(items, Weight); knapsack.display(); Solution solution = knapsack.solve(); solution.display(); >
Отслеживать
ответ дан 2 мар 2020 в 6:09
77 1 1 серебряный знак 10 10 бронзовых знаков
- java
- массивы
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Класс ArrayList . Динамический массив. Общие сведения. Создание массива
Класс ArrayList представляет собой динамический массив. В динамическом массиве элементы добавляются и удаляются при необходимости в отличие от стандартных массивов. В стандартном массиве изменить количество элементов массива не получится. Для этого нужно создавать новый массив с новым размером в другом участке памяти и копировать в него данные исходного стандартного массива.
Динамические массивы эффективны в случаях, когда в начале выполнения программы размер массива (данных) неизвестен. Этот размер формируется по мере необходимости.
Класс ArrayList реализует интерфейс List и имеет следующие объявления:
class ArrayList
здесь E – тип сохраняемых объектов.
Список распространенных методов класса следующий:
- add – добавить элемент в массив;
- addAll – добавить набор в массив;
- clear – очистить массив;
- clone – получить копию массива;
- contains – определить, содержится ли в списке определенный элемент;
- containsAll – определить, есть ли все элементы некоторой коллекции в заданной коллекции;
- ensureCapacity – зарезервировать фрагмент памяти для массива;
- get – получить элемент массива;
- indexOf – определить позицию первого вхождения элемента в массиве;
- isEmpty – определить, пустой ли массив;
- iterator – получить итератор на массив;
- lastIndexOf – определить позицию последнего вхождения элемента в массиве;
- listIterator – получить итератор в виде списка;
- remove – удалить элемент в заданной позиции;
- removeAll – удалить группу элементов из коллекции;
- removeIf – изменить коллекцию на основе предиката;
- replaceAll – произвести вычисление над каждым элементом массива;
- retainAll – сформировать новый массив, содержащий элементы заданной коллекции;
- set – установить новое значение в массиве;
- size – получить размер массива;
- sort – рассортировать элементы массива в заданном порядке;
- subList – получить фрагмент массива на основе заданного массива;
- toArray – конвертировать массив в массив типа Object[] ;
- trimToSize – скорректировать текущий размер массива.
2. Конструкторы класса. Создание массива. Пример
В классе ArrayList определены следующие конструкторы:
ArrayList() ArrayList(Collectionextends E>) ArrayList(int size)
- E – тип элементов коллекции;
- size – текущий размер массива.
Первый конструктор создает пустой динамический массив. Второй конструктор создает динамический массив на основе другого массива.
Третий конструктор создает пустой массив с зарезервированным объемом размера size . Если при наращивании количество элементов в таком массиве превысит size , то зарезервированный объем (максимальная емкость) будет увеличен на некоторую величину.
Пример. В примере создаются разные виды динамических массивов.
import java.util.*; public class TrainCollections < public static void main(String[] args) < // 1. Конструктор ArrayList() // Создать пустой массив целых чисел ArrayList AL = new ArrayList(); // Прибавить к массиву числа от 0 до 9 for (int i=0; iout.println(AL); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] // 2. Создать массив строк на основе другого массива строк, // конструктор ArrayList(Collection) // 2.1. Создать исходный массив ArrayList AS1 = new ArrayList(); AS1.add("Winter"); AS1.add("Spring"); AS1.add("Autumn"); AS1.add("Summer"); System.out.println(AS1); // [Winter, Spring, Autumn, Summer] // 2.2. Использовать конструктор ArrayList(Collection) ArrayList AS2 = new ArrayList(AS1); System.out.println(AS2); // [Winter, Spring, Autumn, Summer] // 3. Конструктор ArrayList(int) // 3.1. Создать пустой массив з зарезервированным размером 8 элементов ArrayList AC = new ArrayList(8); // 3.2. Вывести размер массива System.out.println(AC.size()); // 0 - это есть текущий размер массива > >
Результат выполнения программы
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [Winter, Spring, Autumn, Summer] [Winter, Spring, Autumn, Summer] 0
Связанные темы
- Методы изменяющие данные в массиве. Методы add() , addAll() , clear() , remove() , removeIf() , replaceAll() , set() , sort()
- Методы, определяющие информацию об элементах массива. Методы get() , contains() , containsAll() , indexOf() , lastIndexOf() , iterator() , listIterator()
- Методы определяющие общие характеристики массива. Методы ensureCapacity() , isEmpty() , size() , trimToSize()
- Методы преобразующие массив в целом. Методы clone() , sublist() , toArray() , retainAll()
Динамический массив
В [math]i[/math] -ую ячейку массива записывается элемент [math]x[/math] . Время выполнения — [math]O(1)[/math] .
add(x)
Добавление в массив элемента [math]x[/math] . Время выполнения — [math]O(1)[/math] ; в худшем случае, при котором необходимо перенести все элементы из текущего массива во вдвое больший массив — [math]O(n)[/math] ( [math]n[/math] — размер массива).
del()
Удаляет последний элемент массива. В случае, если количество элементов в массиве в [math]C[/math] раз меньше его длины, то происходит сжатие в [math]B[/math] раз. ( [math]C,B[/math] — константы, зависящие от реализации). Время выполнения операции в худшем случае — [math]O(n)[/math] .
size()
Возвращает количество элементов массива. Время выполнения — [math]O(1)[/math] .
Амортизационная стоимость каждой операции
Пусть наш массив расширяется в [math]2[/math] раза, и уменьшается в [math]2[/math] раза, когда длина массива в [math]4[/math] раза больше количества элементов в массиве. В этом случае амортизационная стоимость каждой операции будет [math]O(1)[/math] .
Метод предоплаты
Стоимость операции add(x)
Иллюстрация
Пусть у нас единицей стоимости операции является одна монетка. Тогда при каждой операции add(x), при которой нам не требуется копирование, мы будем использовать три монетки. Из них одна пойдёт на стоимость самой этой операции, а две будут в резерве (пусть, если мы добавили [math]i[/math] -ый элемент, мы будем класть по одной монетке к элементам с номерами [math]i[/math] и [math]i-\frac[/math] ). В итоге, к тому моменту, как массив будет заполнен, рядом с каждым элементом будет лежать по одной монетке, которую мы и можем использовать на его копирование в новый массив. Таким образом, амортизационная стоимость каждой операции add(x) — [math]3[/math] , и среднее время её работы — [math]O(1)[/math] .
Стоимость операции del()
При каждой операции будем использовать две монетки. Одну из них потратим на само удаление элемента, другую на элемент, стоящий на позиции [math]i \bmod \dfrac[/math] . Тогда даже в самом худшем случае (только что расширились, а потом [math]\dfrac[/math] удалили) у каждого элемента из первых [math]\dfrac[/math] будет по монете и на удаление надо будет потратить только [math]1[/math] монету.
Метод потенциалов
За потенциал примем число: [math]\Phi(c, s) = \begin 2s-c, & \text s\geqslant\fracc \\ \fracc-s, & \text s\lt \fracc \end[/math] , где [math]c[/math] — размер массива, [math]s[/math] — число элементов массива.
Стоимость операции add(x)
- [math]\frac= 1[/math] , массив расширяется: [math] a_i = t_i + \Phi(2c, s + 1) — \Phi(c, s) = (s + 1) + (2(s+1)-2c)-(2s-c) = 3 [/math]
- [math]1\gt \frac\geqslant\frac[/math] , массив не расширяется: [math]a_i=t_i+\Phi(c,s+1)-\Phi(c,s)=1+(2(s+1)-c)-(2s-c)=3[/math]
- [math]\frac\lt \frac, \frac\geqslant\frac[/math] , массив не расширяется:
[math]a_i = t_i + \Phi(c, s+1)-\Phi(c, s)= 1 +(2(s+1)-c)-(\fracc — s)= 3+3s-\fracc= 3 + \frac3c-\fracc \lt 3+\fracc-\fracc=3[/math]
- [math]\frac\lt \frac, \frac\lt \frac[/math] , массив не расширяется: [math]a_i = t_i + \Phi(c, s + 1) — \Phi(c, s) = 1 + (\fracc — (s + 1)) — (\fracc — s) = 0[/math]
В итоге, средняя стоимость операции — [math]3[/math] , а среднее время работы — [math]O(1)[/math] .
Стоимость операции del()
- [math]\frac=\frac[/math] , массив сужается: [math]a_i = t_i + \Phi(\frac, s — 1) — \Phi(c, s) = s + (\frac\cdot\fracc-(s-1)) — (\fracc-s) = 1-\fracc+s=1[/math]
- [math]\frac\lt \frac\lt \frac[/math] , массив не сужается: [math]a_i = t_i + \Phi(c, s — 1) — \Phi(c, s) = 1 + (\fracc-(s-1))-(\fracc-s)= 2[/math]
- [math]\frac\geqslant\frac, \frac\lt \frac\Rightarrow s=\fracc[/math] , массив не сужается: [math]a_i = t_i + \Phi(c, s — 1) — \Phi(c, s) =1 +(\fracc-(s-1))-(2s-c)=2+\fracc-3s = 2[/math]
- [math]\frac\gt \frac[/math] , массив не сужается: [math]a_i = t_i + \Phi(c, s — 1) — \Phi(c, s) = 1 + (2(s-1)-c)-(2s-c)=0[/math]
Средняя стоимость операции — [math]2[/math] , а среднее время работы — [math]O(1)[/math] .
Динамические массивы в современных языках программирования
Динамические массивы широко применяются во многих языках программирования. Рассмотрим, как эта структура данных реализуется в С++ и Java.
С++ — vector
В С++ динамический массив используется в структуре vector, она описана в STL(). Стратегия расширения проста: при попытке записи в массив нового элемента в момент полного заполнения памяти происходит увеличение размера в [math]2[/math] раза при компиляции GNU C++ и в [math]1.5[/math] раза при компиляции Microsoft Visual C++. При удалении элементов уменьшение размера массива никогда не происходит. При инициализации vector по-умолчанию начальный размер равен [math]0[/math] .
Java — ArrayList
В Java структура ArrayList основана на динамическом массиве. При превышении максимального на данный момент размера происходит увеличение в [math]1.5[/math] раза. Причем начальный размер равен [math]10[/math] . Как и в vector, в ArrayList не предусмотрено изменение размера при удалении элементов. Для принудительного изменения размера следует использовать метод trimToSize().
Источники информации
- Wikipedia — Dynamic array
- Wikipedia — Динамический массив
- Дискретная математика и алгоритмы
- Амортизационный анализ
Как создать динамический массив в java



Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
