Java foreach двумерный массив

java Iterator для многомерного массива

Как реализовать интерфейс Iterator для многомерного массива?

Предполагаю, что сделать 2 итератора по столбцу и строке.

public class MatrixIterator implements Iterator < private int[][] values; private int rowIndex = 0; private int colIndex = 0; private IteratorrowIterator; private Iterator colIterator; public MatrixIterator(int[][] values) < this.values = values; rowIterator = new Iterator() < @Override public boolean hasNext() < return values.length >rowIndex; > @Override public Integer next() < return values[rowIndex++][colIndex]; >>; colIterator = new Iterator() < @Override public boolean hasNext() < return values[rowIndex].length >colIndex; > @Override public Integer next() < return values[rowIndex][colIndex++]; >>; > @Override public boolean hasNext() < if (rowIterator.hasNext() && colIterator.hasNext()) < return true; >else < return false; >> @Override public Object next() < if (rowIterator.hasNext()) < if(colIterator.hasNext())< return values[rowIndex][colIndex++]; >else < colIndex =0; return values[rowIndex++][colIndex]; >> else return null; > > 

Тогда как правильно реализовать методы основного класса?

Ответы (4 шт):

Можно попробовать внутри hasNext() итерироваться по массиву с помощью forEach и выдавать нужный объект.

 private class ElementsIterator implements Iterator  < T[][] value; private int cursor = 0; @Override public boolean hasNext() < return cursor != size; >@Override public T next() < //Равен нулю каждый раз при входе в метод. int nextCursor = 0; for (T x[]: value) < for (T y : x) < //сброшенный nextCursor поднимается //до уровня текущей позиции cursor //и отдает нужный элемент. if (nextCursor++ == cursor) < cursor++; return y; >> > //Если перед вызовом next() //проверять есть ли элементы, //то сюда у нас программа не дойдет. throw new NoSuchElementException(); > > 

Для последовательного обхода элементов можно сделать так:

public class MatrixIterator implements Iterator < private int size; //всего элементов в матрице private int position = 0; //номер текущего элемента для "выдачи" private int row = 0; //строка текущего элемента private int col = 0; //столбец текущего элемента private T[][] matrix; public MatrixIterator(T[][] matrix) < this.matrix = matrix; this.size = countElements(matrix); >private int countElements(T[][] matrix) < //считаем количество элементов в матрице int count = 0; for (T[] row : matrix) < count += row.length; >return count; > @Override public boolean hasNext() < return position < size; >@Override public T next() < if (position >= size) < //если перебрали все элементы, то бросить исключение throw new NoSuchElementException(); >T element = matrix[row][col]; //запоминаем текущий элемент //переходим к следующему элементу position++; col++; while (row < matrix.length && col >= matrix[row].length) < //для того, чтоб пропустить возможные "пустые" строки col = 0; row++; >return element; > > 

В данном случае итератор параметризирован, так что не имеет значения с матрицей какого типа работать. В row и col сохраняется позиция текущего элемента, который необходимо вернуть. Цикл while для того, чтоб пропустить возможные пустые строки (например, , <>, , > ). Использовать итератор можно следующим образом

Integer[][] matrix = , <>, , >; Iterator iterator = new MatrixIterator<>(matrix); while (iterator.hasNext())
public class IteratorFor2DArray implements Iterator < private int[][] data; private int i, j; public IteratorFor2DArray(int[][] data) < this.data = data; >@Override public Integer next() < if (!hasNext()) < throw new NoSuchElementException(); >int element = data[i][j]; j++; while (i < data.length && j >= data[i].length) < j = 0; i++; >return element; > @Override public boolean hasNext() < return (i < data.length && j < data[i].length); >> 

Наподобие цикла в цикле или итератора в итераторе, то же самое можно сделать на Stream :

int[][] arr = , >; // обходим двумерный массив и умножаем каждый элемент на 10 IntStream.range(0, arr.length).forEach(i -> IntStream.range(0, arr[i].length).forEach(j -> < arr[i][j] = arr[i][j] * 10; >)); // выводим двумерный массив Arrays.stream(arr).map(Arrays::toString).forEach(System.out::println); // [10, 20, 30] // [40, 50] 

Или можно объединить вложенные массивы в один Stream и обойти его:

int[][] arr = , >; // обходим двумерный массив // и умножаем каждый элемент на 10, // получаем одномерный массив int[] arr1 = Arrays.stream(arr) .flatMapToInt(Arrays::stream) .map(i -> i * 10) .toArray(); // выводим одномерный массив System.out.println(Arrays.toString(arr1)); // [10, 20, 30, 40, 50] 

Источник

Русские Блоги

Синтаксис двумерного массива: динамическая инициализация: тип данных [] [] имя данных = новый тип данных [3] [5]
Значение: получить оценку первого ученика в первом классе. Имя массива [0] [0]
Назначение Назначьте значение первому ученику в первом классе: имя массива [0] [0] = 70;

Читайте также:  Установить время работы скрипта php

Замечания по поводу двумерных массивов:

  1. Метод инициализации такой же, за исключением того, что еще один []
  2. Его метод хранения в памяти такой же, как метод одномерного массива
  3. Если вы используете вложенный цикл для обхода двумерного массива
    Длина внешнего слоя — это имя массива. length (scores.length)
    Внутренний цикл — это имя массива [i] .length (scores [i] .length)


foreach

Также называется расширенным для цикла
Синтаксис: for (имя переменной типа данных: массив или коллекция, которую необходимо просмотреть)

>
Обратите внимание: 1. Знайте тип коллекции или хранилища массивов (например, int или String).
2. За именем переменной следует не точка с запятой, а точка с запятой:
3. При каждом зацикливании массива или коллекции данные будут переданы в имя переменной

Демонстрация кода Foreach:

метод

Формальным параметром метода является ссылочный тип данных.

Тип возвращаемого значения метода — ссылочный тип данных.

Перегрузка метода

Метод написания нескольких имен методов с одной и той же функцией увеличивает нагрузку на программиста
Требования к перегрузке метода :

  1. Должен быть в одном классе
  2. Должны быть разные параметры. 3. Должно иметь одинаковое имя. 4. Не относится к возвращаемому значению.

1. Должен быть в одном классе

2. Это должны быть разные параметры, количество параметров другое или тип параметров другой (имена переменных, которые не содержат параметров, разные)

3. Должен иметь одинаковое имя
4. Это не имеет ничего общего с возвращаемым значением, поскольку вызов не знает тип возвращаемого значения
5.

Интеллектуальная рекомендация

Groovy Integer тип

Сначала смотрите документацию: Это так же, как Java. Джава Например, определить некоторые целочисленные переменные Есть двоичный восьмеричный 16 в Java, то есть также Groovy. Двоичный литеративный дво.

Читайте также:  Форма забыл пароль html

HDU6390 (линейная заглушка Euler+обратные yuan watch)

Ссылка на заголовок:http://acm.hdu.edu.cn/showproblem.php?pid=6390 Идея: если n-это k времени качества p (то есть n = p^k), φ (n) = p^k-p^(k-1) = (p-1) p^(k-1) Полем Если m, n взаимодействие, &phi.

Сортировка алгоритма

Ниже приведен код, который я понял улучшенную сортировку пузыря после изучения пузырькового порядка (удаление содержимого, связанного с логотипом, является общим пузырем), только для справки Если у ва.

Контраст между добавлением, удалением, удалением, удалением, удалением, удалением и изменением двухэтажного списка цикла и последовательного списка и связанного списка

Название каталога Возьмите лидерство в дополнение к удалению, удалению, расследованию и изменению двухэтажного цикла списка Сравнение последовательных таблиц и связанных списков Возьмите лидерство в д.

Источник

Java foreach двумерный массив

Массив представляет набор однотипных значений. Объявление массива похоже на объявление обычной переменной, которая хранит одиночное значение, причем есть два способа объявления массива:

тип_данных название_массива[]; // либо тип_данных[] название_массива;

Например, определим массив чисел:

После объявления массива мы можем инициализовать его:

int nums[]; nums = new int[4]; // массив из 4 чисел

Создание массива производится с помощью следующей конструкции: new тип_данных[количество_элементов] , где new — ключевое слово, выделяющее память для указанного в скобках количества элементов. Например, nums = new int[4]; — в этом выражении создается массив из четырех элементов int, и каждый элемент будет иметь значение по умолчанию — число 0.

Также можно сразу при объявлении массива инициализировать его:

int nums[] = new int[4]; // массив из 4 чисел int[] nums2 = new int[5]; // массив из 5 чисел

При подобной инициализации все элементы массива имеют значение по умолчанию. Для числовых типов (в том числе для типа char) это число 0, для типа boolean это значение false , а для остальных объектов это значение null . Например, для типа int значением по умолчанию является число 0, поэтому выше определенный массив nums будет состоять из четырех нулей.

Однако также можно задать конкретные значения для элементов массива при его создании:

// эти два способа равноценны int[] nums = new int[] < 1, 2, 3, 5 >; int[] nums2 = < 1, 2, 3, 5 >;

Стоит отметить, что в этом случае в квадратных скобках не указывается размер массива, так как он вычисляется по количеству элементов в фигурных скобках.

После создания массива мы можем обратиться к любому его элементу по индексу, который передается в квадратных скобках после названия переменной массива:

int[] nums = new int[4]; // устанавливаем значения элементов массива nums[0] = 1; nums[1] = 2; nums[2] = 4; nums[3] = 100; // получаем значение третьего элемента массива System.out.println(nums[2]); // 4

Индексация элементов массива начинается с 0, поэтому в данном случае, чтобы обратиться к четвертому элементу в массиве, нам надо использовать выражение nums[3] .

Читайте также:  Питон плетение мужское или женское

И так как у нас массив определен только для 4 элементов, то мы не можем обратиться, например, к шестому элементу: nums[5] = 5; . Если мы так попытаемся сделать, то мы получим ошибку.

Длина массива

Важнейшее свойство, которым обладают массивы, является свойство length , возвращающее длину массива, то есть количество его элементов:

int[] nums = ; int length = nums.length; // 5

Нередко бывает неизвестным последний индекс, и чтобы получить последний элемент массива, мы можем использовать это свойство:

int last = nums[nums.length-1];

Многомерные массивы

Ранее мы рассматривали одномерные массивы, которые можно представить как цепочку или строку однотипных значений. Но кроме одномерных массивов также бывают и многомерными. Наиболее известный многомерный массив — таблица, представляющая двухмерный массив:

int[] nums1 = new int[] < 0, 1, 2, 3, 4, 5 >; int[][] nums2 = < < 0, 1, 2 >, < 3, 4, 5 >>;

Визуально оба массива можно представить следующим образом:

Источник

Русские Блоги

Java использует цикл Foreach для вывода двухмерного массива

Распечатайте рисунок ниже

По сути, это печать двухмерного массива 11*11

  1. Шкала строительства составляет [11] [11] Два измерения массива int [] [] Массивы
  2. Назначьте элементы в позиции 1 2 на рисунке
  3. Используйте Foreach, чтобы циркулировать через календарь
    1. Внешний цикл
    2. Внутренний цикл

    Кодовое шоу, как ниже

    public class Demo08   public static void main(String[] args)   // Создать двухмерный массив int[][] arrays = new int[11][11]; arrays[1][2]=1; arrays[2][5]=2; System.out.println("Вывод оригинальный массив:"); // Вывод все массив for (int[] ints : arrays)   for (int anInt : ints)   System.out.print(anInt+"\t"); > System.out.println(); > > > 

    Интеллектуальная рекомендация

    Groovy Integer тип

    Сначала смотрите документацию: Это так же, как Java. Джава Например, определить некоторые целочисленные переменные Есть двоичный восьмеричный 16 в Java, то есть также Groovy. Двоичный литеративный дво.

    HDU6390 (линейная заглушка Euler+обратные yuan watch)

    Ссылка на заголовок:http://acm.hdu.edu.cn/showproblem.php?pid=6390 Идея: если n-это k времени качества p (то есть n = p^k), φ (n) = p^k-p^(k-1) = (p-1) p^(k-1) Полем Если m, n взаимодействие, &phi.

    Сортировка алгоритма

    Ниже приведен код, который я понял улучшенную сортировку пузыря после изучения пузырькового порядка (удаление содержимого, связанного с логотипом, является общим пузырем), только для справки Если у ва.

    Контраст между добавлением, удалением, удалением, удалением, удалением, удалением и изменением двухэтажного списка цикла и последовательного списка и связанного списка

    Название каталога Возьмите лидерство в дополнение к удалению, удалению, расследованию и изменению двухэтажного цикла списка Сравнение последовательных таблиц и связанных списков Возьмите лидерство в д.

    Источник

Оцените статью