Что такое зубчатый массив в Java? Примеры зубчатых массивов
Источник: Dzone Используя это учебное руководство, вы научитесь работать с зубчатыми массивами в Java и ознакомитесь с несколькими практическими примерами их использования. Зубчатый массив (Jagged Array), также известный как массив массивов (array of arrays), представляет собой структуру данных, в которой массив используется для хранения других массивов. Ключевой характеристикой зубчатого массива является то, что каждый элемент основного массива может иметь разные размеры. Это позволяет использовать переменную длину столбцов в двумерной структуре. Чтобы понять концепцию Jagged-массива, давайте рассмотрим пример. Предположим, мы хотим хранить информацию об учениках и их оценках. Мы можем создать зубчатый массив для представления этой структуры данных. Вот как он будет выглядеть: Преимущество использования зубчатого массива заключается в том, что он обеспечивает гибкость хранения данных, когда количество элементов в каждом подмассиве различно. Это особенно полезно в сценариях, где количество столбцов может различаться, например, при работе с нерегулярными данными или разреженными матрицами. В целом зубчатые массивы предоставляют гибкий способ представления структур данных и работы с ними, где размер каждого измерения может варьироваться, что делает их мощным инструментом в определенных сценариях программирования.Пример 1
На изображении, показанном выше, мы сначала объявляем двумерный зубчатый массив jagged Array с тремя строками. Однако на этом этапе мы не указываем длину столбцов. Далее мы присваиваем массивы разного размера каждой строке зубчатого массива. В первой строке три элемента, во второй — два элемента, в третьей — четыре элемента. Наконец, мы используем вложенные циклы для перебора jaggedarray и печати его элементов. Внешний цикл перебирает строки, а внутренний цикл перебирает столбцы каждой строки. Имя файла: JaggedArrayExample.java
public class JaggedArrayExample {
public static void main(String[] args) {
int[][] jaggedArray = new int[3][];
// Назначение массивов разного размера зубчатому массиву
jaggedArray[0] = new int[] { 1, 2, 3, 4 };
jaggedArray[1] = new int[] { 5, 6, 7 };
jaggedArray[2] = new int[] { 8, 9 };
// Доступ и печать элементов зубчатого массива
for (int i = 0; i < jaggedArray.length; i++) {
for (int j = 0; j < jaggedArray[i].length; j++) {
System.out.print(jaggedArray[i][j] + " ");
}
System.out.println();
}
}
}
Вывод:
1 2 3 4
5 6 7
8 9
Пример 2
В приведенном выше коде мы объявляем двумерный массив jaggedArray и инициализируем его именами учащихся разных классов. В первой строке представлены имена учеников первого класса. Во второй строке представлены имена учеников второго класса и так далее. Затем мы используем вложенные циклы для перебора зубчатого массива и вывода имен учащихся в каждом классе. Внешний цикл перебирает строки (оценки), а внутренний цикл перебирает столбцы каждого класса (учащиеся). Имя файла: JaggedArrayExample.java
public class JaggedArrayExample {
public static void main(String[] args) {
// Объявляем и инициализируем двумерный зубчатый массив для хранения имен учащихся разных классов.
String[][] jaggedArray = {
{ "Ram", "Laxman" }, // Grade 1 students
{ "Rahul", "Gauri", "Komal" }, // Grade 2 students
{ "Ajinkya", "Virat", "Tejaswi", "Sanju" } // Grade 3 students
};
// Доступ и печать элементов зубчатого массива
for (int i = 0; i < jaggedArray.length; i++) { // Iterate over the rows (grades)
System.out.print("Grade " + (i + 1) + " students: ");
for (int j = 0; j < jaggedArray[i].length; j++) { // Iterate over the columns (students) of each grade
System.out.print(jaggedArray[i][j] + " "); // Печать имени каждого ученика
}
System.out.println(); // Переход на следующую строку после печати имен учащихся в классе.
}
}
}
Вывод:
Grade 1 students: Ram Laxman
Grade 2 students: Rahul Gauri Komal
Grade 3 students: Ajinkya Virat Tejaswi Sanju
Пример 3
В приведенном выше коде у нас есть зубчатый массив jaggedArray, который хранит разные числа в каждой строке. В первой строке три элемента, во второй строке два элемента, в третьей строке четыре элемента и в четвертой строке один элемент. Затем мы используем вложенные циклы для перебора зубчатого массива и вычисления суммы каждой строки. Внешний цикл перебирает строки, а внутренний цикл перебирает столбцы каждой строки. Сумма каждой строки рассчитывается путем сложения всех элементов в этой строке. Имя файла: JaggedArrayExample.java
public class JaggedArrayExample {
public static void main(String[] args) {
int[][] jaggedArray = {
{ 1, 2, 3 }, // Первая строка с тремя элементами
{ 4, 5 }, // Вторая строка с двумя элементами
{ 6, 7, 8, 9 }, // Третья строка с четырьмя элементами
{ 10 } // Четвертая строка с одним элементом
};
// Вычисляем сумму каждой строки и объявляем результаты
for (int i = 0; i < jaggedArray.length; i++) {
int rowSum = 0;
for (int j = 0; j < jaggedArray[i].length; j++) {
rowSum += jaggedArray[i][j];
}
System.out.println("Sum of row " + (i + 1) + ": " + rowSum);
}
}
}
Вывод:
Sum of row 1: 6
Sum of row 2: 9
Sum of row 3: 30
Sum of row 4: 10
Чем отличается interrupted() от isInterrupted() в Java Threads
Источник: Medium Это руководство поможет вам лучше понять, чем метод interrupted() отличается от метода isInterrupted(), и когда они оба применяются в коде Java. Interrupted: это метод в Java, который проверяет, прерван поток или нет, и возвращает логическое значение, после которого он меняет свое значение с true на false, если значение уже истинно (true). IsInterrupted: это метод, который проверяет значение и никогда не меняет его. То есть, если статус равен true, он останется истинным, но interrupted() изменится с true на false. Пример кода:
class interruption extends Thread{
public void run(){
try{
System.out.println("isInterrupted() = "+Thread.currentThread().isInterrupted());
System.out.println("interrupted() = "+Thread.interrupted());
System.out.println("isInterrupted() = "+Thread.currentThread().isInterrupted());
Thread.sleep(1000);
}
catch(Exception e){
System.out.println("Error found");
}
}
}
class ThisIsMain {
public static void main(String[] args) throws InterruptedException {
interruption i=new interruption();
i.start();
i.interrupt();
}
}
Вывод:
isInterrupted() = true
interrupted() = false
isInterrupted() = false
- Первое значение isInterrupted() возвращает значение true.
- Метод interrupted() вызывает это возвращенное значение true, а затем меняет его на false.
- Первое значение isInterrupted() возвращает значение false, поскольку interrupted() изменило его.
- Почему нет ошибки? Потому что вызов метода interrupted() изменил статус на false перед вызовом sleep(1000).
Реализация методов:
public static boolean interrupted(){};
public boolean isInterrupted(){}
- interrupted() — статический метод, поэтому его можно вызвать напрямую, используя класс Thread.
- isInterrupted() — нестатический метод.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ