Вступление
Печать массива - это быстрый способ дать нам представление о значениях содержимого внутри. Иногда значения массива являются желаемым результатом работы программы.
В этой статье мы рассмотрим, как распечатать массив в Java четырьмя различными способами.
Хотя «лучший способ» зависит от того, что нужно делать вашей программе, мы начнем с простейшего метода печати, а затем покажем более подробные способы сделать это.
- Распечатайте массив с помощью Arrays.toString () и Arrays.deepToString ()
- Печать массива с использованием потоков Java 8
- Распечатать массив путем преобразования в список
- Распечатать массив с помощью циклов For
- Преобразование в список и использование итератора
Распечатайте массив с помощью Arrays.toString () и Arrays.deepToString ()
Встроенный toString()
- чрезвычайно простой способ распечатать
отформатированные версии объектов в Java.
Каждый тип данных в Java считается классом, и по умолчанию каждый класс
наследуется от java.lang.Object
, корня иерархии классов Java. Вот
почему в каждом классе есть метод toString()
Однако массивы не
переопределяют метод toString()
для правильного форматирования вывода,
а просто возвращает унаследованное значение, которое является хешем
объекта.
Мы печатаем массивы с помощью toString()
из класса в
java.util.Arrays
.
Возьмем этот пример, в котором мы печатаем значения массива целых чисел:
int[] intSequence = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println(Arrays.toString(intSequence));
Приведенный выше код выведет следующее:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Обратите внимание, как все элементы разделены запятыми и заключены в квадратные скобки. Этот метод похож на визуальное представление массива.
Мы также можем использовать этот метод для печати массивов разных типов:
double[] doubleValues = {5.5, 2.37, 9.9, 1.02};
System.out.println(Arrays.toString(doubleValues));
String[] stringValues = {"alabama", "arkansas", "kentucky"};
System.out.println(Arrays.toString(stringValues));
Это соответственно приводит к:
[5.5, 2.37, 9.9, 1.02]
[alabama, arkansas, kentucky]
Метод toString()
эффективен только для одномерных массивов. Когда у
нас есть вложенные массивы, нам нужно использовать метод
deepToString()
:
double[][] coordinates = {{40.50, 50.75}, {22.25, 32.75}};
System.out.println(Arrays.deepToString(coordinates));
String[][] songLines = {{"Take your nose off my keyboard"}, {"What you bothering me for?"}};
System.out.println(Arrays.deepToString(songLines));
Это приводит к:
[[40.5, 50.75], [22.25, 32.75]]
[[Take your nose off my keyboard], [What you bothering me for?]]
Если вам нужно с первого взгляда deepToString()
что находится в вашем
массиве, лучше всего подойдут методы toString()
и deepToString ().
Однако эти методы не позволяют форматировать вывод. Этот подход в
основном является обходным решением того факта, что массивы по умолчанию
toString()
Если вы предпочитаете некоторую гибкость форматирования, вы можете рассмотреть возможность использования Java 8 Streams .
Печать массива с использованием потоков Java 8
Один из вариантов печати массива - преобразовать его в поток объектов, а затем распечатать каждый элемент в потоке. У нас есть несколько вариантов использования потоков для печати нашего массива.
Например, мы можем напечатать наш массив построчно, вот так:
String[] languages = {"Java", "Python", "JavaScript"};
Arrays.stream(languages).forEach(System.out::println);
В этом случае мы используем статический метод stream()
Arrays
для
создания последовательного потока наших данных. Для каждого элемента в
нашем потоке мы вызываем на нем println()
, заставляя его построчно
отображаться следующим образом:
Java
Python
JavaScript
Примечание. Мы println()
следующим образом: System.out::println
. ::
в Java - это оператор ссылки на метод. Функция forEach()
может
использовать лямбда-функцию или
ссылку на метод.
В качестве альтернативы мы можем использовать класс Stream
java.util.stream.Stream
для аналогичного вызова функции println()
в
потоке данных нашего массива. Мы можем создать Stream из этих данных с
помощью Stream.of()
:
String[] languages = {"Java", "Python", "JavaScript"};
Stream.of(languages).forEach(System.out::println);
С помощью этого кода мы получим тот же результат:
Java
Python
JavaScript
Давайте попробуем это и с вложенными массивами, добавив даты выпуска начальных версий этих языков:
String[][] languages = {{"Java", "1996"}, {"Python", "1994"}, {"JavaScript", "1995"}};
Arrays.stream(languages).forEach(System.out::println);
// OR
Stream.of(languages).forEach(System.out::println);
Вывод для каждой печати через потоки будет выглядеть примерно так:
[Ljava.lang.String;@e9e54c2
[Ljava.lang.String;@65ab7765
[Ljava.lang.String;@1b28cdfa
Это не очень хорошо работает ... Мы снова вызываем println()
для
объектов массива. Нам придется снова передать эти объекты в поток и
распечатать их элементы.
Чтобы распечатать вложенные массивы, мы можем использовать
лямбда-выражение в функции forEach()
которое может перейти на второй
уровень, создав другой поток каждого уровня и распечатав записи таким
образом:
String[][] languages = {{"Java", "1996"}, {"Python", "1994"}, {"JavaScript", "1995"}};
Arrays.stream(languages).forEach(s -> Arrays.stream(s).forEach(System.out::println));
// OR
Stream.of(languages).forEach(s -> Arrays.stream(s).forEach(System.out::println));
Эта лямбда-функция печатает элементы в каждом вложенном массиве. При компиляции и выполнении мы получим такой вывод:
Java
1996
Python
1994
JavaScript
1995
Потоки упрощают работу с коллекциями. Но Java гибка и предоставляет еще больше возможностей. Традиционный цикл for по-прежнему многое делает для нас. Давайте посмотрим на печать массива с циклами.
Распечатать массив путем преобразования в список
Вы можете легко преобразовать массив Java в реализацию List
Есть
разные способы сделать это, и мы подробно рассмотрели каждый в нашей
статье « Как преобразовать массив Java в
ArrayList».
Короче говоря, вызов toString()
или просто распечатка (которая неявно
вызывает toString()
) в List
распечатает содержимое:
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> numberList = Arrays.asList(numbers);
System.out.println(numberList);
Это приводит к:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Кроме того, вы можете использовать .forEach()
изначально для любой
Collection
, которой является List
. Итак, вы можете просто пойти
дальше и сделать это:
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Arrays.asList(numbers).forEach(System.out::println);
Хотя это не очень хорошо отформатированный вариант:
12345678910
Вы можете отказаться от ссылки на метод и просто использовать лямбда для большего контроля:
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Arrays.asList(numbers)
.forEach(number -> System.out.print(String.format("%d, ", number)));
Это приводит к:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
Распечатать массив с помощью циклов For
Более известный подход к печати массива в Java - использование цикла
for
С помощью for
мы получаем индекс элемента, и мы можем
использовать индекс для получения элемента массива.
Мы настраиваем for
с переменной, обычно называемой i
, в качестве
счетчика, начиная с элемента 0
. Затем следует условие, которое
сравнивает i
с количеством элементов в массиве.
Примечание . Число элементов в массиве, которые будут использоваться
в условии цикла, никогда не следует жестко задавать. Java предоставляет
атрибут с именем length
который позволяет программисту динамически
вычислять количество элементов в массиве.
И последнее, но не менее важное: for
принимает инкрементное значение,
в нашем случае мы будем использовать i++
чтобы увеличивать счетчик на
один элемент в каждой итерации.
Как только наш цикл настроен и готов, мы просто воспользуемся
System.out.println()
для отображения каждого элемента в массиве,
используя обозначение прямоугольных скобок [i]
принимая в качестве
входных данных наш счетчик i
.
Вот пример, в котором мы печатаем все элементы целочисленного массива построчно:
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < numbers.length; i++){
System.out.println(numbers[i]);
}
Выполнение этого кода выведет на консоль следующее:
1
2
3
4
5
6
7
8
9
10
Больше не нужно использовать циклы for
Они довольно гибкие и
концептуально простые. Например, если у вас были вложенные массивы, вы
будете использовать вложенные циклы for
Наконец, давайте взглянем на итераторы и списки.
Преобразование в список и использование итератора
Объект итератора Java позволяет нам отображать каждый элемент нашего
массива без необходимости использовать индексный подход, который мы
рассмотрели в разделе цикла for
Чтобы использовать итераторы, мы должны изменить тип данных массива на
List
. Мы можем сделать это с помощью Array.asList()
и сохранить
возвращаемые значения списка в новой переменной. Метод asList()
принимает массив и превращает его в реализацию List
Затем вам понадобится объект-итератор для настройки итератора массива. Итератор похож на указатель, указывающий на каждый элемент массива. Итератор помогает вам исследовать каждый элемент в индивидуальном порядке.
Чтобы создать объект-итератор, мы будем использовать метод iterator()
нашего List
. После того, как наш объект итератора был создан мы
используем while
цикл , как это предлагает более компактный способ
печати каждого элемент возвращения итератора.
В while
условие цикла будет содержать призыв к hasNext()
метод
нашего итератора. Внутри в while
цикла, мы выводим каждый элемент с
помощью вызова System.out.println()
. Мы получаем элементы из
итератора, вызывая метод next()
. В while
цикл будет держать
итерации над каждым элементом , пока мы не проходится наш массив (по
List
).
Вот пример, в котором мы берем массив целых чисел и печатаем каждый элемент построчно с помощью итератора:
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> numberList = Arrays.asList(numbers);
Iterator<Integer> numberIterator = numberList.iterator();
while(numberIterator.hasNext()) {
System.out.println(numberIterator.next());
}
По сравнению с циклами for этот метод предпочитают разработчики, которые
предпочитают не иметь дело с индексами массивов. Вам гарантирован
следующий элемент с помощью next()
. Итераторы мощны, потому что мы
используем этот же поток для любого типа List
такого как ArrayList
или LinkedList
, а также для других коллекций, таких как Map
или
Set
!
Заключение
В этой статье мы рассмотрели основные методы, используемые для печати
массива в Java. Мы начали с использования встроенных методов Java
toString()
и deepToString()
.
Оттуда мы использовали потоки, чтобы мы могли быстро печатать элементы массива построчно. Мы также рассмотрели, как преобразовать массив в список, который вы можете либо просто вызвать, либо использовать Java 8 Stream API для более детального контроля.
Затем мы использовали традиционную for
для печати каждого элемента по
отдельности.
И последнее , но не в последнюю очередь, мы использовали объект
итератора для печати каждый элемент по отдельности с помощью next()
метод внутри в while
цикла. Подходы, описанные в этой главе, могут
использоваться в зависимости от варианта использования и проблемы,
которую вы пытаетесь решить.