Динамический Массив
Нужна помощь , не могу нигде найти , как создать одномерный массив, размер которого пользователь сам указывает ?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Реализовать динамический массив с плавающей верхней границей
Начинающий, пока ничего не понимаю в этом( Реализовать динамический массив с плавающей верхней.
Как реализовать метод добавления массива int в динамический массив
Банально, реализую свой динамический массив. В интерфейсе все как положено //Добавление в.
Создать консольное приложение, реализующее структуру данных динамический массив и позволяющее
Создать консольное приложение, реализующее структуру данных динамический массив и позволяющее: .
Динамический массив (Название страны — столица страны)
создать динамического массива (не менее 10 элементов) с возможностью занесения, поиска и удаления.
Динамический массив
Это часть программы. Мне нужно, чтобы пользователь вводил дробные числа, количество которых заранее.
3850 / 2138 / 566
Регистрация: 02.09.2015
Сообщений: 5,425
Сообщение от Youngchi 
как создать одномерный массив, размер которого пользователь сам указывает ?
1 2 3 4
final var scanner = new Scanner(System.in); final var size = scanner.nextInt(); final var array = new int[size]; System.out.println(Arrays.toString(array));
Регистрация: 17.01.2021
Сообщений: 154
Arsegg, Arrays подчеркивает: «Cannot resolve symbol ‘Arrays’ »
87 / 31 / 16
Регистрация: 01.06.2019
Сообщений: 638

Сообщение было отмечено Youngchi как решение
Решение
Сообщение от Youngchi 
«Cannot resolve symbol ‘Arrays’ »
1 2 3 4 5
Scanner sc = new Scanner(System.in); System.out.print("Введите размер массива: "); int size = sc.nextInt(); int array[] = new int[size]; System.out.println(Arrays.toString(array));
Регистрация: 17.01.2021
Сообщений: 154
Дан одномерный массив (N+15) отсортировать нечетные числа по убыванию (четные оставить на своих местах), числа генерировать случайно в интервале [-N-15; N+15], не могу понять , где ошибка , ничего не сортирует , и выводит фиг пойми что, можете помочь ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
package com.company; import java.util.*; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("Введите размер массива: "); int N = in.nextInt(); int size = N + 15; int arr[] = new int[size]; Random rand = new Random(); FillingArray(arr, size, N); for(int i = 0; i size; i++){ System.out.println(Arrays.toString(arr)); } WorkingArray(arr, size, N); for(int i = 0; i size; i++){ System.out.println(Arrays.toString(arr)); } } public static void FillingArray(int arr[], int size, int N){ Random rand = new Random(); for (int i = 0; i size; i++) { arr[i] = ((int)(Math.random() * 31) - 15); } } public static void WorkingArray(int arr[], int size, int N){ for (int i = 0; i size; i++) { int temp; if (arr[i] % 2 == 0 && arr[i+1] % 2 == 0 && arr[i] > arr[i+1]) { temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = arr[i]; } } } }
Динамический массив
В [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
«В отличие от классического массива, может хранить null;» ♂️♂️♂️ С каких это пор классические массивы не могут хранить null .
Виктор Уровень 20 Expert
26 сентября 2020
Спасибо за статью, законспектировал из забрал к себе на канал. — Канал в телеге про Java и Android, в котором есть книги для скачивания, статьи, видеоуроки, чат для обмена знаниями и моральной поддержки : ) Давайте учиться вместе: @LetsCodeIt p. s. Мой личный телеграм канал вкатывальщика в прогерство: @SefoNotasi
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2023 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2023 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
Java-массивы. Динамические массивы в Java

Массив — набор определённого числа однотипных элементов. Использование массива позволяет нам не создавать большое количество переменных, а создать всего лишь одну переменную, имеющую вид массива. В отличие от стандартных переменных массивы содержат больше, чем одно значение. В программировании это очень важно, ведь при разработке софта может потребоваться огромное количество данных.
Лучшая ассоциация для массива — стена с почтовыми ячейками. Каждая ячейка помечена квартирными номерами (индексы массива), внутри лежат газеты и письма (элементы массива), а получить содержимое можно, открыв ящик ключом (обратиться к содержимому по позиции элемента в массиве через индекс). При этом содержимое массива может включать в себя как простые данные (это одномерный массив), так и несколько вложенных массивов (это многомерный массив).
Массив однороден, и во всех ячейках должны храниться элементы одного типа. Если это int, то мы говорим про массив целых чисел, который может содержать лишь целые числа. Массив строк будет содержать лишь строки, а массив, состоящий из элементов созданного класса Dog, может содержать лишь объекты Dog.
Как происходит объявление массива в Java
Как и любую переменную в Java, массив надо объявить. Для этого есть два способа. Первый больше отвечает стилю Java, второй является наследием языка C.

Вне зависимости от способа, dataType — это тип переменных в массиве. Посмотрите внимательно на примеры — в них объявлены 2 массива. Один предназначен для целых чисел типа int, другой — для объектов типа Object.
Можно сказать, что во время объявления массива ему присваивается как имя (ArrayName), так и тип переменных.
Создание массива
Чтобы создать массив в Java, нужно зарезервировать место в памяти, для чего используем оператор new:
new typeOfArray [length];Здесь у нас typeOfArray — тип массива, length — длина массива или число ячеек, выраженное в целых числах (int). Но мы лишь выделили память под массив, не связав его ни с какой переменной, ранее объявленной. Как правило, сначала массив объявляют, потом создают:
int[] myArray; // объявление массива myArray = new int[10]; // создание массива, выделение памяти на 10 элементов типа intИтак, объявлен массив из целых чисел с именем myArray. После объявления мы сообщили, что массив состоит из 10 ячеек. Но можно использовать и более сокращённый синтаксис:
int[] myArray = new int[10]; // объявление и выделение памяти за один разЧто же, мы создали массив с помощью new. После этого в его ячейках будут записаны значения по умолчанию. Например, для численных типов — это нули (0), для boolean — false, а если говорить о ссылочных типах, то null. Это значит, что после выполнения кода
int[] myArray = new int[10];у нас на выходе будет массив из 10 целых чисел, причём в каждой ячейке будет записан 0.
Длина массива length
Длина массива — число элементов, под которое этот массив рассчитан. Длину массива изменить после создания нельзя.
Ещё нюанс: элементы массива в Java нумеруются с нуля. Таким образом, массив на 10 элементов состоит из чисел в диапазоне 0-9.
Если нужно получить доступ к длине нашего массива, используют переменную length:
int[] myArray = new int[10]; // создали массив, присвоили имя myArray System.out.println(myArray.length); // вывели в консоль длину массиваВывод программы: 10Инициализация массива
Инициализация — это заполнение массива конкретными данными, а не данными по умолчанию.
Нижеследующий код позволит создать массив, включающий в себя 4 сезона года. Также мы выполним заполнение массива строками-названиями сезонов:
String[] seasons = new String[4]; /* выполнили объявление и создание массива из 4 строк, где по умолчанию записано null, ведь строка — ссылочный тип данных*/ seasons[0] = "Winter"; /* в первую ячейку записали строку Winter*/ seasons[1] = "Spring"; /* во вторую ячейку (номер 1) записали строку Spring и т. д.*/ seasons[2] = "Summer"; seasons[3] = "Autumn";Так мы записали названия всех сезонов. Но в принципе можно всё сделать проще, совместив инициализацию и объявление:
String[] seasons = new String[] ;Или даже так, опустив оператор new:
String[] seasons = ;Динамический массив в Java
Минус массива — статичность, то есть необходимость задавать размер заранее. Для этого и придумали динамический массив, который может менять размер в процессе выполнения программы. Например, статические массивы работают по следующей схеме:
А динамические массивы в Java функционируют несколько иначе:
Так как для копирования массива используется специальная нативная функция, проблем с «переездом» не возникает.
В общем, как вы уже догадались, динамические массивы применяются во время обработки наборов однородных данных, размер которых на момент написания программы нам неизвестен.


