Массивы в java
Содержание:
- Инициализируем 3-мерный массив в Java
- Метод Arrays.sort()
- Append a New Item to an Array
- Неровные массивы
- Java initializing arrays
- IntConsumer, LongConsumer, DoubleConsumer
- Заполнение Arrays.fill()
- Работа с ячейками массива
- Arrays and Helper Classes
- Сортировка массивов
- Метод Arrays.fill()
- Создание массива
- Бинарный поиск элемента в одномерном массиве
- The Arrays Class
- Java irregular arrays
- Итерация
- Метод Arrays.deepToString()
- Копируем массив
- Литералы
- Быстрая инициализация массива в Java
- Processing Arrays
- Объявление, создание, инициализация
- Обработка элементов массива
Инициализируем 3-мерный массив в Java
На самом деле, трёхмерный массив инициализируется практически так же, как и двумерный:
// test — 3-мерный массив int[][][] test = { { {1, -2, 3}, {2, 3, 4} }, { {-4, -5, 6, 9}, {1}, {2, 3} } };
Трёхмерный Java-массив состоит из 2-мерных массивов. И, разумеется, длина рядов может быть различна.
Давайте напишем программу, выводящую элементы 3-мерного массива посредством циклов:
class ThreeDArray { public static void main(String[] args) { // test – 3-мерный массив int[][][] test = { { {1, -2, 3}, {2, 3, 4} }, { {-4, -5, 6, 9}, {1}, {2, 3} } }; // цикл for..each проходит по всем элементам 3-мерного массива for (int[][] array2D test) { for (int[] array1D array2D) { for(int item array1D) { System.out.println(item); } } } } }
Итог будет следующим:
1 -2 3 2 3 4 -4 -5 6 9 1 2 3
Метод Arrays.sort()
Ну и самое вкусное — сортировка. В программировании сортировать массивы приходится очень часто. Три самых частых действия при работе с массивами:
- Сортировка массива
- Поиск минимального (или максимального) элемента массива
- Определение индекса элемента в массиве (поиск элемента в массиве)
И именно поэтому разработчики Java включили в класс метод. Вот как выглядит его вызов:
Этот метод сортирует переданный массив по возрастанию.
Пример:
Переменная содержит значение: |
Отлично, да? Вызвал один метод, и вот у вас еще отсортированный массив. Красота.
Кстати, сортировать можно не только весь массив, но и часть массива. Вот как выглядит его вызов:
Где первый и последний — это номера первой и последней ячеек, которых должна коснуться сортировка.
По старой доброй традиции Java, последний элемент не входит в диапазон.
Пример:
Переменная содержит значение: |
В Java для сортировки массивов используется самый быстрый алгоритм сортировки — QuickSort. Скорость его сортировки зависит от размера массива и рассчитывается по формуле N*Log(N).
Сортировка массива из 1000 элементов будет содержать около 3_000 сравнений ячеек массива. Сортировка массива из миллиона элементов будет содержать около 6 миллионов сравнений.
Append a New Item to an Array
As we know, arrays hold a fixed size of values. Therefore, we can’t just add an item and exceed this limit.
We’ll need to start by declaring a new, larger array, and copy the elements of the base array to the second one.
Fortunately, the Arrays class provides a handy method to replicate the values of an array to a new different-sized structure:
Optionally, if the ArrayUtils class is accessible in our project, we can make use of its add method (or its addAll alternative) to accomplish our objective in a one-line statement:
As we can imagine, this method doesn’t modify the original array object; we have to assign its output to a new variable.
Неровные массивы
В Java вы как программист можете не только поменять строки двумерного массива местами, но и сконструировать этот массив самому так, как вам хочется.
Допустим, вы хотите, чтобы у первой строки двумерного массива была длина , а у второй — . Можно ли так сделать? Да, можно.
Для начала нужно создать «контейнер контейнеров» – первый массив, который будет хранить ссылки на массивы-строки. Делается это так:
Вы просто не указываете второй параметр, и Java-машина создает только «контейнер контейнеров». Вот что будет в памяти после выполнения этого кода:
Ну а как создавать одномерные массивы, вы уже знаете
Вот как будет выглядеть итоговый код:
Двумерный массив Нулевая строка — массив из элементов Первая строка — массив из элементов. |
Только что вы создали так называемый «неровный массив».
И вот если мы захотим вывести все элементы этого массива на экран, нам очень пригодится свойство у массива: длины строк массива ведь разные.
Кстати, как узнать длину «контейнера контейнеров» в нашем примере? Это ведь тоже объект-массив, а значит, у него есть длина. Правильный ответ — .
А у массивов-строк как?
Java initializing arrays
There are several ways how we can initialize an array in Java. In the first
example, an array is created and initialized in two steps.
com/zetcode/InitArray.java
package com.zetcode; import java.util.Arrays; public class InitArray { public static void main(String[] args) { int[] a = new int; a = 1; a = 2; a = 3; a = 4; a = 5; System.out.println(Arrays.toString(a)); } }
We create and initialize a numerical array. The contents of the
array are printed to the console.
int[] a = new int;
Here we create an array which can contain five elements. The statement allocates
memory for five integers. The square brackets are used for declaring an array,
the type ( in our case) tells us what type of values the array will
hold. An array is an object and therefore it is created with the
keyword.
a = 1; a = 2; a = 3; a = 4; a = 5;
We initialize the array with some data. This is assignment initialization.
The indexes are in the square brackets. Number 1 is going to be the first
element of the array, number 2 is the second etc.
System.out.println(Arrays.toString(a));
The class is a helper class which contains various methods for
manipulating arrays. The method returns a string representation
of the contents of the specified array. This method is helpful in debugging.
$ java InitArray.java
This is the output of the example.
We can declare and initialize an array in one statement.
com/zetcode/InitArray2.java
package com.zetcode; import java.util.Arrays; public class InitArray2 { public static void main(String[] args) { int[] a = new int[] { 2, 4, 5, 6, 7, 3, 2 }; System.out.println(Arrays.toString(a)); } }
This is a modified version of the previous program.
int[] array = new int[] { 2, 4, 5, 6, 7, 3, 2 };
An array is created and initialized in one step. The elements
are specified in curly brackets. We did not specify the length
of the array. The compiler will do it for us.
The one step creation and initialization can be further simplified
by only specifying the numbers between the curly brackets.
com/zetcode/InitArray3.java
package com.zetcode; import java.util.Arrays; public class InitArray3 { public static void main(String[] args) { int[] a = { 2, 4, 5, 6, 7, 3, 2 }; System.out.println(Arrays.toString(a)); } }
An array of integers is created using the most simple way
of array creation.
int[] a = { 2, 4, 5, 6, 7, 3, 2 };
The construct can be omitted. The right side of the
statement is an array literal notation. It resembles the C/C++ style of
array initialization. Even if we drop the keyword, the array is
created the same way as in previous two examples. This is just a convenient
shorthand notation.
IntConsumer, LongConsumer, DoubleConsumer
Начиная с Java 8, у нас есть встроенные потребительские интерфейсы для примитивных типов данных: IntConsumer, LongConsumer и DoubleConsumer.
package com.zetcode; import java.util.Arrays; import java.util.function.DoubleConsumer; import java.util.function.IntConsumer; import java.util.function.LongConsumer; public class JavaForEachConsSpec { public static void main(String[] args) { int[] inums = { 3, 5, 6, 7, 5 }; IntConsumer icons = i -> System.out.print(i + " "); Arrays.stream(inums).forEach(icons); System.out.println(); long[] lnums = { 13L, 3L, 6L, 1L, 8L }; LongConsumer lcons = l -> System.out.print(l + " "); Arrays.stream(lnums).forEach(lcons); System.out.println(); double[] dnums = { 3.4d, 9d, 6.8d, 10.3d, 2.3d }; DoubleConsumer dcons = d -> System.out.print(d + " "); Arrays.stream(dnums).forEach(dcons); System.out.println(); } }
В этом примере мы создаем три типа потребителей и перебираем их с помощью forEach().
Обычный способ зациклить карту.
Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E", 50); items.put("F", 60); for (Map.Entry<String, Integer> entry : items.entrySet()) { System.out.println("Item : " + entry.getKey() + " Count : " + entry.getValue()); }
В Java 8 Вы можете зациклить карту с помощью forEach + лямбда-выражения.
Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E", 50); items.put("F", 60); items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v)); items.forEach((k,v)->{ System.out.println("Item : " + k + " Count : " + v); if("E".equals(k)){ System.out.println("Hello E"); } });
Нормальный цикл for в цикле список.
List items = new ArrayList<>(); items.add("A"); items.add("B"); items.add("C"); items.add("D"); items.add("E"); for(String item : items){ System.out.println(item); }
В Java 8 вы можете зациклить список с помощью forEach + лямбда-выражения или ссылки на метод.
List items = new ArrayList<>(); items.add("A"); items.add("B"); items.add("C"); items.add("D"); items.add("E"); //lambda //Output : A,B,C,D,E items.forEach(item->System.out.println(item)); //Output : C items.forEach(item->{ if("C".equals(item)){ System.out.println(item); } }); //method reference //Output : A,B,C,D,E items.forEach(System.out::println); //Stream and filter //Output : B items.stream() .filter(s->s.contains("B")) .forEach(System.out::println);
Оцени статью
Оценить
Средняя оценка / 5. Количество голосов:
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Спасибо за ваши отзыв!
Заполнение Arrays.fill()
Класс Arrays имеет набор методов с именем fill(), которые могут заполнять массив заданным значением. Это проще, чем перебирать массив и вставлять значение самостоятельно. Вот пример использования Arrays.fill() для заполнения массива int:
int[] intArray = new int; Arrays.fill(intArray, 123); System.out.println(Arrays.toString(intArray));
В этом примере создается массив int и заполняется значение 123 во всех элементах массива. Последняя строка примера преобразует массив в строку и выводит его на консоль:
Существует версия метода Arrays.fill(), которая принимает значения from и to index, поэтому только элементы с индексами в этом интервале заполняются заданным значением:
int[] intArray = new int; Arrays.fill(ints2, 3, 5, 123) ; System.out.println(Arrays.toString(intArray));
Этот пример заполняет только те элементы, которые имеют индексы 3 и 4(от 3 до 5 без 5) значением 123. Вывод:
0, 0, 0, 123, 123, 0, 0, 0, 0, 0]
Работа с ячейками массива
Хорошо, создавать массивы мы научились, а как правильно с ними работать?
Да практически так же, как и с обычными переменными, только после имени переменной-массива обязательно нужно указывать номер ячейки, с которой мы работаем.
Нумерация ячеек массива всегда начинается с нуля. Если у нас массив на элементов, то номера (индексы) его ячеек , если массив на элементов, то . И дальше по аналогии.
Примеры:
Код | Пояснение |
---|---|
Создаем массив на элементов типа . В ячейку с индексом записываем значение . В ячейку с индексом записываем значение . В ячейку с индексом записываем сумму значений, которые хранятся в ячейках (хранится ) и (хранится ). |
Вот что будет храниться в памяти после выполнения данного кода:
Колонка слева (серым цветом) — это номера (индексы) ячеек. В ячейках хранятся внесенные значения: , и . Сразу после создания ячейки массива заполнены нулями.
Важно. Все ячейки массива имеют одинаковый тип данных
Если мы создали массив строк , в его ячейках можно хранить только строки. Тип данных массива задается при его создании. Ни тип данных, ни длину массива в дальнейшем поменять нельзя.
Arrays and Helper Classes
Before proceeding, it’s useful to understand what is an array in Java, and how to use it. If it’s your first time working with it in Java, we suggest having a look at this previous post where we covered all basic concepts.
Please note that the basic operations that an array supports are, in a certain way, limited. It’s not uncommon to see complex algorithms to execute relatively simple tasks when it comes to arrays.
For this reason, for most of our operations, we’ll be using helper classes and methods to assist us: the Arrays class provided by Java and the Apache’s ArrayUtils one.
To include the latter in our project, we’ll have to add the Apache Commons dependency:
We can check out the latest version of this artifact .
Сортировка массивов
Метод Arrays.sort([]a)
Метод sort() из класса Arrays использует усовершенствованный алгоритм Быстрой сортировки (Quicksort), который эффективен для большинства набора данных. Метод упорядочивает весь массив в порядке возрастания значений элементов.
Формат метода
Arrays.sort([]a),
[]a – исходный массив, после работы метода массив будет содержать упорядоченные значения элементов в порядке возрастания.
Пример.
//исходный массив double a[] = { 41.5, 11.4, 11.2, 3.1, 4.3, 5.5 }; //сортировка Arrays.sort(a); //результат сортировки for(int i=0; i<a.length; i++) System.out.print(a+" "); //3.1 4.3 5.5 11.2 11.4 41.5 System.out.println();
Метод Arrays.sort([]a,index1,index2)
выполняет сортировку части массива по возрастанию массива от index1 до index2 минус единица
Формат метода
Arrays.sort([]a,index1,index2),
[]a – исходный массив
index1, index2 — начальный и конечный индексы, определяющие диапазон упорядочивания элементов по возрастанию.
Пример.
//исходный массив int b[] ={2,1,0,50,30,20,10}; //сортировка от 0 элемента до 3, сам третий элемент не входит Arrays.sort(b,0,3); //результат сортировки for(int i=0; i<b.length; i++) System.out.print(b+" "); // 0 1 2 50 30 20 10 System.out.println(); //сортировка элементов от 3 до конца массива bb.length Arrays.sort(b,3,b.length); for(int i=0; i<b.length; i++) System.out.print(b+" "); //0 1 2 10 20 30 50 System.out.println();
Сортировка массива по убыванию
Формат метода
Arrays.sort([]a, Collections.reverseOrder());
При сортировке массива в обратном порядке (по убыванию) нужно использовать вместо примитивного типа, объектный тип.
Пример.
//// сортировrка по убыванию //вместо примитивного типа double //используем объектный тип Double Double a[] = new Double; //заполняем массив случаными числами for(int i = 0; i < a.length; i++) { a = (double)(Math.random() * 20); System.out.format("%.2f ", a); } System.out.println(); System.out.println("Массив,отсотированный по убыванию"); //Сортируем массив Arrays.sort(a, Collections.reverseOrder()); //Выводим отсортированный массив на консоль. for(int i = 0; i < a.length; i++) { System.out.format("%.2f ", a); } System.out.println();
Результат
15,39 1,54 17,47 15,50 3,83 16,43 18,87 15,54 8,23 12,97
Массив,отсотированный по убыванию
18,87 17,47 16,43 15,54 15,50 15,39 12,97 8,23 3,83 1,54
Метод Arrays.fill()
Очень часто у Java-программистов при работе с массивами возникает задача: заполнить массив одинаковыми значениями. Можно, конечно, написать цикл и просто в цикле присвоить каждой ячейке массива определенное значение:
А можно просто вызвать метод , который делает точно то же самое: заполняет переданный массив переданным значением. Вот как это выглядит:
И код из примера выше можно сделать немного компактнее и понятнее:
А еще с помощью метода можно заполнить определенным значением не весь массив, а его часть:
Где первый и последний — это номера первой и последней ячеек, которые нужно заполнить.
По старой доброй традиции Java, последний элемент не входит в диапазон.
Пример:
Заполняем ячейки , , , значениями . Нумерация ячеек массива с нуля! Переменная содержит значение: |
Метод работает только с одномерными массивами. Если в него передать двумерный массив, он будет обработан как одномерный, со всеми вытекающими последствиями.
Создание массива
Чтобы создать массив в Java, нужно зарезервировать место в памяти, для чего используем оператор new:
new typeOfArray length];
Здесь у нас typeOfArray — тип массива, length — длина массива или число ячеек, выраженное в целых числах (int). Но мы лишь выделили память под массив, не связав его ни с какой переменной, ранее объявленной. Как правило, сначала массив объявляют, потом создают:
int[] myArray; // объявление массива myArray = new int10]; // создание массива, выделение памяти на 10 элементов типа int
Итак, объявлен массив из целых чисел с именем myArray. После объявления мы сообщили, что массив состоит из 10 ячеек. Но можно использовать и более сокращённый синтаксис:
int[] myArray = new int10]; // объявление и выделение памяти за один раз
Что же, мы создали массив с помощью new. После этого в его ячейках будут записаны значения по умолчанию. Например, для численных типов — это нули (0), для boolean — false, а если говорить о ссылочных типах, то null. Это значит, что после выполнения кода
int[] myArray = new int10];
у нас на выходе будет массив из 10 целых чисел, причём в каждой ячейке будет записан 0.
Бинарный поиск элемента в одномерном массиве
Бинарный поиск – алгоритм поиска элемента в отсортированном массиве. Алгоритм основывается на принципе последовательного деления массива пополам.
Формат метода
int index=Arrays.binarySearch([]a,элемент x),
х — искомое значение
Метод возвращает:
index – индекс элемента в массиве, если поиск успешный,
отрицательное число – если в массиве элемент не найден
Примечание.
Массив должен быть отсортирован! В противном случае результат будет неопределенным.
Пример.
int[] a = {7, 2, 9, 1, 0, 3, 4, 8, 5, 6}; int x=5; //сортируем массив Arrays.sort(a); int index = Arrays.binarySearch(a, x); System.out.println("Массив= " + Arrays.toString(a)); System.out.println("искомое значение = " + x); System.out.println("индекс = " + index);
Будет выведено:
Массив=
искомое значение = 5
индекс = 5
Пример.
String [] month = {"январь","февраль","март", "апрель","май","июнь", "июль","август","сентябрь", "октябрь","ноябрь","декабрь"}; String strSearch="март"; Arrays.sort(month); int index = Arrays.binarySearch(month,strSearch ); System.out.println("Массив= " + Arrays.toString(month)); System.out.println("искомое значение = " + strSearch); System.out.println("индекс = " + index);
Будет выведено:
Массив=
искомое значение = март
индекс = 6
The Arrays Class
The java.util.Arrays class contains various static methods for sorting and searching arrays, comparing arrays, and filling array elements. These methods are overloaded for all primitive types.
Sr.No. | Method & Description |
---|---|
1 |
public static int binarySearch(Object[] a, Object key) Searches the specified array of Object ( Byte, Int , double, etc.) for the specified value using the binary search algorithm. The array must be sorted prior to making this call. This returns index of the search key, if it is contained in the list; otherwise, it returns ( – (insertion point + 1)). |
2 |
public static boolean equals(long[] a, long[] a2) Returns true if the two specified arrays of longs are equal to one another. Two arrays are considered equal if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal. This returns true if the two arrays are equal. Same method could be used by all other primitive data types (Byte, short, Int, etc.) |
3 |
public static void fill(int[] a, int val) Assigns the specified int value to each element of the specified array of ints. The same method could be used by all other primitive data types (Byte, short, Int, etc.) |
4 |
public static void sort(Object[] a) Sorts the specified array of objects into an ascending order, according to the natural ordering of its elements. The same method could be used by all other primitive data types ( Byte, short, Int, etc.) |
Previous Page
Print Page
Next Page
Java irregular arrays
Arrays that have elements of the same size are called rectangular arrays. It is
possible to create irregular arrays where the arrays have a different size. In
C# such arrays are called jagged arrays.
com/zetcode/IrregularArrays.java
package com.zetcode; public class IrregularArrays { public static void main(String[] args) { int[][] ir = new int[][] { {1, 2}, {1, 2, 3}, {1, 2, 3, 4} }; for (int[] a : ir) { for (int e : a) { System.out.print(e + " "); } } System.out.print('\n'); } }
This is an example of an irregular array.
int[][] ir = new int[][] { {1, 2}, {1, 2, 3}, {1, 2, 3, 4} };
This is a declaration and initialization of an irregular array.
The three inner arrays have 2, 3, and 4 elements.
for (int[] a : ir) { for (int e : a) { System.out.print(e + " "); } }
The enhanced for loop is used to go through all the
elements of the array.
$ java IrregularArrays.java 1 2 1 2 3 1 2 3 4
This is the output of the example.
Итерация
Как перебрать все элементы массива, используя цикл Java for:
String[] stringArray = new String; for(int i=0; i < stringArray.length; i++) { stringArray = "String no " + i; } for(int i=0; i < stringArray.length; i++) { System.out.println( stringArray ); }
В этом примере:
- Сначала создается массив ссылок String. Когда впервые создаете массив ссылок на объекты, каждая из ячеек в массиве указывает на ноль, а не на объект.
- Первый из двух циклов for выполняет итерацию по массиву String, создает строку и делает ссылку на ячейку этой строкой.
- Второй из двух циклов for перебирает массив String и печатает все строки, на которые ссылаются ячейки.
Если бы это был массив int (примитивные значения), он мог бы выглядеть так:
int[] intArray = new int; for(int i=0; i < intArray.length; i++) { intArray = i; } for(int i=0; i < intArray.length; i++) { System.out.println( intArray ); }
Переменная i инициализируется равной 0 и работает до длины массива минус 1. В этом случае i принимает значения от 0 до 9, каждый раз повторяя код внутри цикла for один раз, и для каждой итерации i имеет другое значение.
Как перебрать массив с помощью цикла «for-each» в Java. Вот как это выглядит:
int[] intArray = new int; for(int theInt : intArray) { System.out.println(theInt); }
Цикл for-each дает вам доступ к каждому элементу в массиве по одному, но не информацию об индексе каждого элемента. Есть доступ только к значению. Изменить значение элемента в этой позиции невозможно. Если это нужно, используйте обычный цикл for, как показано ранее.
Цикл for-each также работает с массивами объектов. Вот пример, как выполнить итерацию массива объектов String:
String[] stringArray = {"one", "two", "three"}; for(String theString : stringArray) { System.out.println(theString); }
Метод Arrays.deepToString()
Но если вы с помощью метода попробуете преобразовать в строку (вывести на экран) двумерный массив, увидите кое-что знакомое:
А все дело в том, что в ячейках двумерного массива хранятся ссылки на одномерные массивы. А одномерные массивы как преобразовываются в строку? Именно так, как вы видите выше.
И что же делать? Как нам получить правильное отображение двумерного массива?
Для этого у класса есть еще один специальный метод — . Вызов его выглядит так:
В этот метод можно передать двумерный, одномерный, трехмерный и вообще массив любой размерности, и он всегда будет отображать элементы массива.Обрати внимание: метод не работает с одномерными массивами примитивов (например, ). Примеры:
Примеры:
Переменная будет содержать строковое значение: | |
Переменная будет содержать строковое значение: | |
Переменная будет содержать строковое значение: |
Копируем массив
Чтобы скопировать массив, проще всего использовать arraycopymethod из класса System. Метод принимает пять параметров: исходный массив, позиция в индексе (с которой необходимо начать копирование элементов), новый массив, позиция в индексе для начала вставки и количество копируемых элементов:
public static void arraycopy (Object src, int srcPos, Object dest, int destPos, int length)
В примере мы создаём новый массив, в котором содержатся последние четыре элемента из массива int:
int[] lotteryNumbers = {16,32,12,23,33,20}; int[] newArrayNumbers = new int; System.arraycopy(lotteryNumbers, 2, newArrayNumbers, 0, 4);
Так как массивы имеют фиксированную длину, arraycopymethod позволяет удобно изменять длину массива.
Чтобы лучше познакомиться с массивами, можете прочитать о том, как управлять массивами при помощи класса Arrays. А также о том как создавать динамический массив Java (то есть, массивов с нефиксированным количеством элементов) при помощи класса ArrayList.
Данная публикация является переводом статьи «Working With Arrays in Java» , подготовленная редакцией проекта.
Литералы
Язык программирования Java содержит ярлык для создания экземпляров массивов примитивных типов и строк. Если вы уже знаете, какие значения вставлять в массив, вы можете использовать литерал массива. Вот он как выглядит в коде Java:
int[] ints2 = new int[]{ 1,2,3,4,5,6,7,8,9,10 };
Обратите внимание, как значения, которые будут вставлены в массив, перечислены внутри блока {…}. Длина этого списка также определяет длину созданного массива
Не нужно писать новую часть int [] в последних версиях Java. Достаточно:
int[] ints2 = { 1,2,3,4,5,6,7,8,9,10 };
Стиль работает для массивов всех примитивных типов, а также массивов строк. Вот пример строкового массива:
String[] strings = {"one", "two", "three"};
Быстрая инициализация массива в Java
Массивы — очень полезная вещь, поэтому разработчики Java постарались сделать работу с ними максимально удобной.
И первое, что они сделали — это упростили инициализацию массива, занесение в него стартовых значений.
Ведь очень часто, кроме данных, которая программа откуда-то считывает, ей для работы нужны еще свои внутренние данные. Например, нам нужно хранить в массиве длины всех месяцев. Как может выглядеть этот код:
Но есть способ записать его короче — спасибо создателям Java:
Можно просто перечислить через запятую все значения массива!
Удобно, да? Но и это еще не все.
Оказывается компилятор может определить тип контейнера (объекта-массива) на основе типа переменной-массива. А для определения длины массива — банально подсчитать количество элементов, написанных в фигурных скобках.
Поэтому этот код можно записать еще короче:
Разве не красота?
Такая запись называется «быстрая инициализация массива». Она, кстати, работает не только для типа …
Processing Arrays
When processing array elements, we often use either for loop or foreach loop because all of the elements in an array are of the same type and the size of the array is known.
Example
Here is a complete example showing how to create, initialize, and process arrays −
public class TestArray { public static void main(String[] args) { double[] myList = {1.9, 2.9, 3.4, 3.5}; // Print all the array elements for (int i = 0; i < myList.length; i++) { System.out.println(myList + " "); } // Summing all elements double total = 0; for (int i = 0; i < myList.length; i++) { total += myList; } System.out.println("Total is " + total); // Finding the largest element double max = myList; for (int i = 1; i < myList.length; i++) { if (myList > max) max = myList; } System.out.println("Max is " + max); } }
This will produce the following result −
Объявление, создание, инициализация
Перед тем как массив использовать, его нужно:
- Объявить;
- Создать;
- Инициализировать.
Запомните это порядок действий и никогда не нарушайте его.При объявлении нужно сначала указать какой тип данных будет там храниться.
Все дело в том, что Java строго типизированный язык программирования. Это означает что Вы не можете объявить переменную типа строка (String), а потом присвоить этой переменной числовое значение.
Например такой код работать не будет: String a = 1;
Именно поэтому при объявлении массива сначала указывают тип данных который он будет принимать. Дальше идут [] (квадратные скобки) и имя переменной. Или имя переменной, квадратные скобки. Разницы не будет:
char nameOfArray[], int anotherName [], char [] nameOfArr, String [] p — это все правильные варианты для объявления массивов.
После того, как array был объявлен, его нужно создать. Дело в том, что в массив это объект. Объекты в java хранятся в памяти отдельно от переменных и примитивных типов. Для каждого объекта выделяется память в программе. В которой он будет находиться до того момента пока будет нужен. Чтобы указать программе что мы резервируем место для объекта нужно воспользоваться ключевым словом new.
В случае с массивами нужно еще указать сколько элементов мы будем хранить в них. Программа сразу зарезервирует память и выделит ячейки под нужное количество элементов.
Выше Вы можете видеть пример создания и инициализации массива. Сразу после знака равно (=) идет создание array с именем a. В квадратных скобках указана размерность (количество элементов).
Сразу после создания, в объект будут записаны значения по умолчанию. Для численного массива это ноль (0), для объекта — null, для boolean — false.
Для того, чтобы поменять значение по умолчанию нужно массив инициализировать (заполнить данными). По сути, после того как Вы создали массив (запись после знака равно), он уже инициализировался. Просто данными по умолчанию.
Если Вы хотите поменять эти данные — сделать это довольно просто: нужно обратиться по индексу массива к его элементу и присвоить ему значение. Например:
В квадратных скобках на примере выше указан индекс, а после знака равно — новое значение элемента по данному индексу.
Есть еще один способ инициализации:
Таким образом мы объединяем объявление, создание, инициализацию в одну строку. При таком подходе можно даже опустить new char[]:
Обработка элементов массива
Существует несколько стандартных алгоритмов
обработки элементов массива:
-
Удаление значения из массива по
определенному индексу. -
Вставка значения в массив по
определенному индексу. - Сортировка элементов массива.
Начнем с первого
– удаления элемента из массива. Создадим вот такой массив:
final int N = 9; short a = new shortN;
запишем туда
значения с 1 по 9:
for(int i=;i < N;++i) ai = (short)(i+1);
Теперь удалим
элемент со значением 6. Для этого нужно проделать такую операцию:
Причем, сначала
перемещаем 7-ку на место 6-ку, затем 8-ку и 9-ку, то есть, двигаемся от
удаляемого элемента к концу массива. Программа будет выглядеть так:
final int N = 9; short a = new shortN; for(int i=;i < N;++i) ai = (short)(i+1); for (int i = 5; i < N-1; ++i) ai = ai + 1; for (short val a) System.out.print(val+" ");
Здесь мы начали
движение с 5-го индекса (то есть 6-го элемента массива) и на первой итерации
делаем операцию a=a, то есть, 7-ку ставим на место 6-ки.
На следующей итерации уже имеем a=a – перемещаем
8-ку и, затем, a=a – перемещаем 9-ку. Все, в итоге
значение 6 было удалено из массива.
Теперь реализуем второй алгоритм и
вставим значение 4, которого не хватает вот в таком массиве:
short a = new short {1, 2, 3, 5, 6, 7, 8, 9, 9};
Здесь в конце записаны две 9, чтобы мы
могли сдвинуть все элементы на 1 вправо и вставить элемент со значением 4. То
есть, нам следует выполнить такую операцию над элементами массива:
Обратите
внимание, что сдвиг осуществляется с конца массива. Если мы начнем это делать с
4-го, то просто затрем все остальные значения пятеркой
Итак, вот программа,
которая вставляет 4-ку в этот массив:
short a = new short {1, 2, 3, 5, 6, 7, 8, 9, 9}; for (int i = 8; i > 3; --i) ai = ai - 1; a3 = 4; for (short val a) System.out.print(val+" ");
Здесь счетчик i в цикле сначала
равен 8 – это индекс последнего элемента нашего массива. Затем, делается
операция a=a, то есть, a=a. Таким
образом, мы присваиваем 8-му элементу значение 7-го элемента. Это и есть
смещение значения вправо. На следующей итерации i уменьшается на
1, то есть, равно 7 и операция повторяется: a=a и так далее,
последний смещаемый элемент будет: a=a. После этого
i будет равно 3,
условие цикла становится ложным и он завершается. После смещения, мы
присваиваем 4-му элементу массива значение 4 и выводим получившийся массив на
экран.
Теперь
рассмотрим довольно распространенный алгоритм сортировки элементов массива по
методу всплывающего пузырька. Реализуем его на языке Java.
byte a = {3, 5, 1, 6, 2, 4}; for (int i = ; i < a.length-1; ++i) { byte min = ai; int pos = i; for (int j = i + 1; j < a.length; ++j) if (min > aj) { pos = j; min = aj; } byte t = ai; ai = apos; apos = t; } for (short val a) System.out.print(val+" ");
Здесь первый
цикл показывает с какого элемента искать минимальный, то есть, это
местоположение той вертикальной черты в методе всплывающего пузырька. Затем,
задаем две вспомогательные переменные min – минимальное найденное
значение, pos – индекс
минимального элемента в массиве. Второй вложенный цикл перебирает все
последующие элементы массива и сравнивает его с текущим минимальным и если
будет найдено меньшее значение, то min становится
равной ему и запоминается его позиция. Вот эти три строчки меняют местами
текущее значение элемента с найденным минимальным, используя вспомогательную
переменную t. И в конце
программы выполняется вывод элементов массива на экран.
Запустим эту
программу и посмотрим как она работает. Кстати, если мы теперь хотим выполнить
сортировку по убыванию, то достаточно изменить вот этот знак на
противоположный.
Видео по теме
#1 Установка пакетов и первый запуск программы
#2 Структура программы, переменные, константы, оператор присваивания
#3 Консольный ввод/вывод, импорт пакетов
#4 Арифметические операции
#5 Условные операторы if и switch
#6 Операторы циклов while, for, do while
#7 Массивы, обработка элементов массива
#8 (часть 1) Строки в Java, методы класса String
#8 (часть 2) Строки — классы StringBuffer и StringBuider
#9 Битовые операции И, ИЛИ, НЕ, XOR
#10 Методы, их перегрузка и рекурсия