Как напечатать массив на Java

Введение Печать массива - это быстрый способ дать нам представление о значениях содержимого внутри. Иногда значения массива являются желаемым результатом работы программы. В этой статье мы рассмотрим, как распечатать массив в Java четырьмя различными способами. Хотя «лучший способ» зависит от того, что нужно делать вашей программе, мы начнем с простейшего метода печати, а затем покажем более подробные способы сделать это. * Распечатать массив с помощью Arrays.toString () и Arrays.deepToString () * Печать

Вступление

Печать массива - это быстрый способ дать нам представление о значениях содержимого внутри. Иногда значения массива являются желаемым результатом работы программы.

В этой статье мы рассмотрим, как распечатать массив в Java четырьмя различными способами.

Хотя «лучший способ» зависит от того, что нужно делать вашей программе, мы начнем с простейшего метода печати, а затем покажем более подробные способы сделать это.

Распечатайте массив с помощью 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 цикла. Подходы, описанные в этой главе, могут использоваться в зависимости от варианта использования и проблемы, которую вы пытаетесь решить.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus