Автор оригинала: Mohamed Echout.
Вступление
Печать массива – это быстрый способ дать нам представление о значениях содержимого внутри. Иногда значения массива являются желаемым результатом работы программы.
В этой статье мы рассмотрим как печатать массив на Java четырьмя различными способами.
Хотя “лучший способ” зависит от того, что должна делать ваша программа, мы начнем с самого простого метода печати, а затем покажем более подробные способы его выполнения.
- Распечатайте массив с помощью Arrays.toString() и Arrays.deepToString()
- Печать массива с использованием потоков Java 8
- Печать массива путем преобразования в список
- Выведите массив с помощью циклов For
- Преобразование в список и Использование Итератора
Распечатайте массив с помощью Arrays.toString() и Arrays.deepToString()
Встроенный метод toString ()
-это чрезвычайно простой способ печати отформатированных версий объектов на Java.
Каждый тип данных в Java считается классом, и по умолчанию каждый класс наследуется от java.lang.Объект
, корень иерархии классов Java. Вот почему у каждого класса есть метод toString ()
. Однако массивы не переопределяют метод toString()
для удобного форматирования выходных данных, и он просто возвращает унаследованное значение, которое является хэшем объекта.
Мы печатаем массивы с помощью метода toString()
из класса в java.util.Массивы
.
Возьмем этот пример, где мы выводим значения массива целых чисел:
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?]]
Если вам нужно наглядное представление о том, что находится в вашем массиве с первого взгляда, методы toString()
и deepToString ()
– ваш лучший вариант.
Однако эти методы не позволяют отформатировать вывод. Этот подход в основном является обходным путем для того факта, что массивы по умолчанию не переопределяют метод toString ()
.
Если вы предпочитаете некоторую гибкость в форматировании, вы можете рассмотреть возможность использования Java 8 потоков .
Печать массива с использованием потоков Java 8
Один из вариантов печати массива-преобразовать его в поток объектов, а затем распечатать каждый элемент в потоке. У нас есть несколько вариантов использования потоков для печати нашего массива.
Например, мы можем распечатать наш массив построчно следующим образом:
String[] languages = {"Java", "Python", "JavaScript"}; Arrays.stream(languages).forEach(System.out::println);
В этом случае мы используем метод static stream()
класса Массивы
для создания последовательного потока наших данных. Для каждого элемента в нашем потоке мы вызываем функцию println ()
, чтобы он отображался строка за строкой следующим образом:
Java Python JavaScript
Примечание: Мы ссылаемся на функцию println()
следующим образом: System.out::println
. ::
в Java является оператором ссылки на метод. Функция forEach()
может использовать либо лямбда – функцию , либо ссылку на метод .
В качестве альтернативы мы можем использовать класс Stream
из java.util.stream.Stream
для аналогичного вызова функции println()
в потоке данных нашего массива. Мы можем построить поток этих данных, используя 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
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Это не очень хорошо работает… Мы снова вызываем 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()
) в Списке
реализации, распечатает содержимое:
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ListnumberList = Arrays.asList(numbers); System.out.println(numberList);
Это приводит к:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Кроме того, вы можете использовать .forEach()
изначально в любой Коллекции
, которой является Список
. Так что вы можете просто пойти дальше и сделать то же самое:
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 заключается в использовании цикла для
. С помощью цикла для
мы получаем индекс элемента, и мы можем использовать индекс для получения элемента массива.
Мы настраиваем цикл для
с переменной, обычно называемой i
, в качестве счетчика, начинающегося с элемента 0
. Затем следует условие, которое сравнивает i
с количеством элементов в массиве.
Примечание : Количество элементов в массиве, которые будут использоваться в состоянии цикла, никогда не должно быть жестко закодировано. Java предоставляет атрибут length
, который позволяет программисту динамически вычислять количество элементов в массиве.
И последнее, но не менее важное: наш цикл для
принимает инкрементное значение, в нашем случае мы будем использовать обозначение 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
Использовать для
циклов не так уж много. Они довольно гибкие и концептуально просты. Например, если у вас были вложенные массивы, то вы будете использовать вложенные для
циклов.
Наконец, давайте взглянем на итераторы и списки.
Преобразование в список и Использование Итератора
Объект итератора Java позволяет нам отображать каждый элемент вашего массива без использования индексного подхода, который мы рассмотрели в разделе для
цикла.
Чтобы использовать итераторы, мы должны изменить тип данных массива на Список
. Мы можем сделать это с помощью метода Array.asList()
и сохранить значения списка, возвращенные в новой переменной. Метод asList()
принимает массив и превращает его в реализацию List
.
Затем вам понадобится объект итератора для настройки итератора массива. Итератор подобен указателю, указывающему на каждый элемент массива. Итератор помогает вам проверять каждый элемент особым образом.
Для создания объекта итератора мы будем использовать метод iterator()
нашего Списка
. Как только наш объект итератора был создан, мы используем цикл while
, поскольку он предлагает более компактный способ печати каждого элемента, возвращаемого итератором.
Условие цикла while
будет содержать вызов метода hasNext()
нашего итератора. Внутри цикла while
мы печатаем каждый элемент, вызывая System.out.println()
. Мы получаем элементы из итератора, вызывая метод next ()
. Цикл while
будет повторяться над каждым элементом до тех пор, пока мы не пройдем наш массив (через Список
).
Вот пример, в котором мы берем массив целых чисел и выводим каждый элемент построчно с помощью итератора:
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ListnumberList = Arrays.asList(numbers); Iterator numberIterator = numberList.iterator(); while(numberIterator.hasNext()) { System.out.println(numberIterator.next()); }
По сравнению с циклами for, этот метод предпочитают разработчики, которые предпочитают не иметь дело с индексами массивов. Вам гарантирован предстоящий элемент с next()
. Итераторы являются мощными , потому что мы используем один и тот же поток для любого типа Списка
, такого как ArrayList
или Связанный список
, а также для других коллекций, таких как Карта
или Набор
!
Вывод
В этой статье мы рассмотрели основные методы, используемые для печати массива в Java. Мы начали с использования встроенных методов Java toString()
и deepToString()
.
Оттуда мы использовали потоки, чтобы мы могли быстро печатать элементы массива строка за строкой. Мы также рассмотрели, как преобразовать массив в список, который вы можете либо просто вызвать, либо использовать API Java 8 Stream для более детального управления.
Затем мы использовали традиционную структуру для
цикла для печати каждого элемента по отдельности.
И последнее, но не менее важное: мы использовали объект итератора для печати каждого элемента отдельно, используя метод next()
внутри цикла while
. Подходы, описанные в этой главе, могут быть использованы в зависимости от варианта использования и проблемы, которую вы пытаетесь решить.