[javaSE] Definición y uso de matrices

Tabla de contenido

Conceptos básicos de arreglos

Por qué usar una matriz

que es una matriz

Creación e inicialización de arreglos

creación de matrices

Inicialización de matriz

inicialización dinámica

inicialización estática

 Precauciones

uso de arreglos

Acceder a los elementos de una matriz

Precauciones

iterar sobre la matriz

Las matrices son tipos de referencia.

Conozca la distribución de memoria de JVM

La diferencia entre las variables de tipo básico y las variables de tipo de referencia

Más sobre las variables de referencia

​Editar Sabiendo nulo

Aplicaciones de arreglos

guardar datos

como parámetro de función

Paso de parámetro tipo de datos básico

Tipo de matriz de paso de parámetro (tipo de datos de referencia)

Resumir

como el valor de retorno de la función

​Ejercicio de edición de arreglos

matriz a cadena

copia de matriz

Encuentre el promedio de los elementos en una matriz

editar

Encuentra el elemento especificado en la matriz

búsqueda secuencial

búsqueda binaria

Clasificación de matriz (burbuja)

Ideas de algoritmos

ejemplo de código 

Orden inverso de la matriz

tren de pensamiento

ejemplo de código 

Matriz bidimensional

gramática básica

for-each atraviesa una matriz binaria

Método Arrays.deepToString 

matriz binaria irregular 

Resumir


En cuanto a la definición y uso de arreglos, el blogger también lo explicó en la etapa de lenguaje C. Si estás interesado, puedes ir al siguiente enlace para conocer más ¿Quieres saber sobre arreglos ? Entre y eche un vistazo_Blog de Spring Breeze-CSDN Blog https://blog.csdn.net/m0_71731682/article/details/130564827?spm=1001.2014.3001.5501

1. Arreglos: ¿Por qué los arreglos comienzan a numerarse desde 0 en lugar de 1?  _A dime blog de tecnología-CSDN blog_¿Por qué la matriz comienza desde 0?  

Conceptos básicos de arreglos

Por qué usar una matriz

Suponiendo que desea guardar los puntajes de la prueba javaSE de 5 estudiantes y generarlos, si no usa una matriz, escribirá el siguiente código

public class TestStudent{
    public static void main(String[] args){
        int score1 = 70;
        int score2 = 80;
        int score3 = 85;
        int score4 = 60;
        int score5 = 90;
        System.out.println(score1);
        System.out.println(score2);
        System.out.println(score3);
        System.out.println(score4);
        System.out.println(score5);
    }
}

No hay problema con el código anterior, pero lo malo es: si hay 20 estudiantes con calificaciones, ¿tengo que crear 20 variables? Si hay calificaciones de 100 estudiantes, no es necesario crear 100 variables. Observe atentamente las calificaciones de estos estudiantes y descubra que: todas las calificaciones son del mismo tipo , entonces, ¿hay un tipo en Java que pueda almacenar múltiples datos del mismo tipo?

Respuesta: Sí, esta es la matriz de la que estamos a punto de hablar

que es una matriz

Array: Puede considerarse como una colección de elementos del mismo tipo. Es un espacio continuo en la memoria. como un verdadero garaje

En java, una matriz que contiene 6 elementos de tipo entero es equivalente a los 6 espacios de estacionamiento conectados entre sí en la figura anterior, como se puede ver en la figura anterior:

1. Los elementos almacenados en la matriz son del mismo tipo.
2. Los espacios en la matriz están conectados entre sí.
3. Cada espacio tiene su propio número. De hecho, el número de la posición es 0, que es el subíndice de la matriz 

Entonces, ¿cómo crear una matriz en el programa?

Creación e inicialización de arreglos

creación de matrices

T[] 数组名 = new T[N];

T: indica el tipo de elementos almacenados en el arreglo
T[]: indica el tipo del arreglo
N: indica la longitud del arreglo

Por ejemplo

int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组
double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组
String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组

Inicialización de matriz

La inicialización de matriz se divide principalmente en inicialización dinámica e inicialización estática

inicialización dinámica

Al crear una matriz, especifique directamente la cantidad de elementos en la matriz

int[] array = new int[10];

inicialización estática

Al crear una matriz, la cantidad de elementos de datos no se especifica directamente, pero el contenido de datos específico se especifica directamente

formato gramatical

El primer tipo: T[] nombre de matriz = {datos1, datos2, datos3, ..., datosn},
el segundo tipo: T[] nombre de matriz = new T{datos1, datos2, datos3,..., datosn};

Ambos son equivalentes

//第一种
int[] array1 = {0,1,2,3,4,5,6,7,8,9};
double[] array2 = {1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = {"hell", "Java", "!!!"};
//第一种
int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{"hell", "Java", "!!!"};

 Precauciones

1. Aunque la inicialización estática no especifica la longitud de la matriz, el compilador determinará la longitud de la matriz según la cantidad de elementos en {} durante la compilación.
2. Durante la inicialización estática, el tipo de datos en {} debe ser consistente con el tipo de datos antes de [].
3. La inicialización estática se puede abreviar, omitiendo la nueva T[] detrás

// 注意:虽然省去了new T[], 但是编译器编译代码时还是会还原
int[] array1 = {0,1,2,3,4,5,6,7,8,9};
double[] array2 = {1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = {"hell", "Java", "!!!"};

4. Las matrices también se pueden crear de acuerdo con los siguientes números en lenguaje C, lo cual no se recomienda

/*
该种定义方式不太友好,容易造成数组的类型就是int的误解
[]如果在类型之后,就表示数组类型,因此int[]结合在一块写意思更清晰
*/
int arr[] = {1, 2, 3};

5. La inicialización estática y dinámica también se puede dividir en dos pasos, pero no se puede omitir el formato

int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};
// 注意省略格式不可以拆分, 否则编译失败
// int[] array3;
// array3 = {1, 2, 3};

6. Si la matriz no se inicializa, los elementos de la matriz tienen sus valores predeterminados

     Si el tipo de elemento de almacenamiento en la matriz es el tipo de clase base, el valor predeterminado es el valor predeterminado correspondiente al tipo de clase base, por ejemplo:

tipo valores predeterminados
byte 0
corto 0
En t 0
largo 0
flotar 0.0f
doble 0.0
carbonizarse /u0000
booleano FALSO

Si el tipo de elemento de almacenamiento en la matriz es un tipo de referencia, el valor predeterminado es nulo

uso de arreglos

Acceder a los elementos de una matriz

Una matriz es un espacio continuo en la memoria. El número del espacio comienza desde 0 y aumenta secuencialmente. Este número se denomina subíndice de la matriz, y la matriz puede acceder a sus elementos en cualquier posición a través del subíndice .

Por ejemplo

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);

// 也可以通过[]对数组中的元素进行修改
array[0] = 100;
System.out.println(array[0]);

Precauciones

1. La matriz es un espacio de memoria continuo, por lo que admite el acceso aleatorio, es decir, para acceder rápidamente a los elementos en cualquier posición de la matriz a través del acceso de subíndice 2. El subíndice
comienza desde 0 y el rango entre [0, N) no no incluir N, N Es la cantidad de elementos y no puede exceder el límite; de ​​lo contrario, se informará una excepción fuera de los límites del subíndice

int[] array = {1, 2, 3};
System.out.println(array[3]); // 数组中只有3个元素,下标一次为:0 1 2,array[3]下标越界

// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)

Se lanza una java.lang.ArrayIndexOutOfBoundsException. Al usar una matriz, asegúrese de subíndice y tenga cuidado con los límites.

iterar sobre la matriz

El llamado "recorrido" se refiere a visitar todos los elementos de la matriz, y el acceso se refiere a realizar ciertas operaciones en los elementos de la matriz.

Por ejemplo: imprimir

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);

El código anterior puede servir para atravesar los elementos de la matriz, pero el problema es:

1. Si se agrega un elemento a la matriz, debe agregar una declaración de impresión
2. Si hay 100 elementos en la entrada, debe escribir 100 declaraciones de impresión
3. Si desea modificar la impresión para agregar 1 a cada elemento en la matriz, es muy problemático modificarlo.

Al observar el código, se puede encontrar que la operación en cada elemento de la matriz es la misma, por lo que puede usar un ciclo para imprimir

Al igual que el lenguaje C

int[]array = new int[]{10, 20, 30, 40, 50};
    for(int i = 0; i < 5; i++){
        System.out.println(array[i]);
}

Después de cambiar a un bucle, los tres defectos anteriores se pueden resolver para los problemas 2 y 3, pero el problema 1 no se puede resolver. ¿Puedo obtener la longitud de la matriz?

La respuesta es sí, nota: en la matriz puedes pasar

matriz objeto.longitud

para obtener la longitud de la matriz

Por ejemplo:

int[]array = new int[]{10, 20, 30, 40, 50};
    for(int i = 0; i < array.length; i++){
        System.out.println(array[i]);
}

Los arreglos también se pueden recorrer usando for-each

Por ejemplo

int[] array = {1, 2, 3};
    for (int x : array) {
        System.out.println(x);
}

for-each es otra forma de usar el ciclo for, puede completar más convenientemente el recorrido de la matriz, puede evitar condiciones de ciclo y declaraciones de actualización.

Las matrices son tipos de referencia.

Conozca la distribución de memoria de JVM

La memoria es un espacio de almacenamiento continuo, que se utiliza principalmente para almacenar datos cuando el programa se está ejecutando. Por ejemplo:

1. El código debe cargarse en la memoria cuando el programa se está ejecutando.
2. Los datos intermedios generados por el programa en ejecución deben almacenarse en la memoria.
3. Las constantes en el programa también deben guardarse
. 4. Algunos datos es posible que deba almacenarse durante mucho tiempo, y algunos datos se almacenarán después de que se ejecute el método para ser destruidos

Si los datos almacenados en la memoria se almacenan indiscriminadamente, será muy problemático para la gestión de la memoria. Por ejemplo:

 Encontrar cosas en una casa ordenada definitivamente será más rápido que en una casa desordenada, porque una casa ordenada clasifica todo

Por lo tanto, la JVM también divide la memoria utilizada según diferentes funciones:


 

Contador de programa (registro de PC) : solo un pequeño espacio, guarde la dirección de la siguiente instrucción ejecutada
Pila de máquina virtual (pila JVM) : alguna información relacionada con las llamadas a métodos, cada método primero creará una pila cuando se ejecute Frame , la pila El marco contiene: tabla de variables locales, pila de operandos, enlace dinámico, dirección de retorno y otra información, todo lo cual está relacionado con la ejecución del método. Por ejemplo: variables locales. Cuando el método termina de ejecutarse, el marco de la pila se destruye, es decir, los datos guardados en el marco de la pila también se destruyen.
Pila de métodos nativos (Pila de métodos nativos) : La pila de métodos nativos es similar a la pila de la máquina virtual. Solo el contenido guardado es la variable local del método nativo . En algunas versiones de la implementación de JVM (como HotSpot), el método nativo pila y la máquina virtual La pila es un
montón (Heap): el área de memoria más grande administrada por la JVM.Los objetos creados usando new se almacenan en el montón (por ejemplo, el new anterior int[]{1, 2,3}) , y el montón está junto con el programa. Se crea cuando comienza a ejecutarse y se destruye cuando el programa sale. Mientras los datos en el montón todavía estén en uso, no se destruirán .
Área de método: se utiliza para almacenar datos como información de clase, constantes, variables estáticas, código compilado por el compilador instantáneo, etc. que han sido cargados por la máquina virtual. El código de bytes compilado por el método se almacena en esta área.
 

La diferencia entre las variables de tipo básico y las variables de tipo de referencia

Las variables creadas por tipos de datos básicos se denominan variables básicas y los valores correspondientes se almacenan directamente en el espacio de variables;

La variable creada por el tipo de datos de referencia generalmente se denomina la referencia del objeto y su espacio almacena la dirección del espacio donde se encuentra el objeto.

Por ejemplo

public static void func() {
    int a = 10;
    int b = 20;
    int[] arr = new int[]{1,2,3};
}

En el código anterior, a, b y arr son todas variables dentro de la función, por lo que su espacio se asigna en el marco de pila correspondiente al método func.

a y b son variables del tipo integrado, por lo que lo que se almacena en su espacio es el valor inicializado para la variable.

matriz es una variable de referencia de tipo matriz, y el contenido almacenado en su interior puede entenderse simplemente como la primera dirección de la matriz en el espacio de almacenamiento dinámico.

Como se puede ver en la figura anterior, la variable de referencia no almacena directamente el objeto en sí, sino que se puede entender simplemente como el almacenamiento de la dirección de inicio del objeto en el espacio de almacenamiento dinámico. A través de esta dirección, la variable de referencia se puede utilizar para manipular el objeto . Es un poco similar a los punteros en lenguaje C, pero las referencias en Java son más simples que las operaciones con punteros.

Más sobre las variables de referencia

public static void func() {
int[] array1 = new int[3];
array1[0] = 10;
array1[1] = 20;
array1[2] = 30;

int[] array2 = new int[]{1,2,3,4,5};
array2[0] = 100;
array2[1] = 200;

array1 = array2;
array1[2] = 300;
array1[3] = 400;
array2[4] = 500;
for (int i = 0; i < array2.length; i++) {
        System.out.println(array2[i]);
    }
}

resultado de la operación


 ¿Por qué aparecen estos valores?

Por favor vea el diagrama

Crear matriz1 y matriz2

Pasos después de matriz1 = matriz2 

 reconocer nulo

Null significa "referencia nula" en Java , es decir, una referencia que no apunta a un objeto

Por ejemplo

int[] arr = null;
System.out.println(arr[0]);

// 执行结果
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:6)

El papel de null es similar a NULL (puntero nulo) en lenguaje C, lo que significa una ubicación de memoria no válida. Por lo tanto, no se pueden realizar operaciones de lectura o escritura en esta memoria. Una vez que intente leer o escribir, se lanzará una NullPointerException

Nota: en el lenguaje C, dijimos que el puntero nulo en realidad apunta a la dirección 0, y no hay acuerdo en java de que exista alguna relación entre nulo y la memoria en la dirección 0.

Aplicaciones de arreglos

guardar datos

Por ejemplo

 public static void main(String[] args) {
        int[] array = {1, 2, 3};

        for(int i = 0; i < array.length; ++i){
            System.out.println(array[i] + " ");
        }
    }

También podemos usar for-each para guardar aquí. El blogger no dará un ejemplo aquí. Para aquellos que no recuerdan, pueden mirar la matriz transversal mencionada anteriormente.

como parámetro de función

Paso de parámetro tipo de datos básico

 public static void main(String[] args) {
        int num = 0;
        func(num);
        System.out.println("num = " + num);
    }
    public static void func(int x) {
        x = 10;
        System.out.println("x = " + x);
    }


// 执行结果
x = 10
num = 0

Se encuentra que modificar el valor del parámetro formal x en el método func no afecta el valor numérico del parámetro real.

Esto se debe a que num creará un espacio en la pila en el que se almacena 0, y cuando se llama al método func, se creará un nuevo espacio para x, y los dos no interferirán entre sí, como se muestra en la figura a continuación.

Tipo de matriz de paso de parámetro (tipo de datos de referencia)

Por ejemplo

public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        func(arr);
        System.out.println("arr[0] = " + arr[0]);
    }
    public static void func(int[] a) {
        a[0] = 10;
        System.out.println("a[0] = " + a[0]);
    }


// 执行结果
a[0] = 10
arr[0] = 10

Se encuentra que el contenido de la matriz se modifica dentro del método func, y el contenido de la matriz fuera del método también cambia.

Debido a que la matriz es un tipo de referencia, pasarla de acuerdo con el tipo de referencia puede modificar el contenido almacenado en ella.


Nota: si la matriz pasada tiene un objeto nuevo, el cambio en el parámetro formal no afectará el parámetro real en este momento.

Resumir

La llamada "referencia" es esencialmente solo almacenar una dirección. Java establece la matriz como un tipo de referencia, de modo que el paso de parámetro de matriz subsiguiente en realidad solo pasa la dirección de la matriz al parámetro de función. Esto puede evitar la Copia completa de la matriz (la matriz puede ser más larga, por lo que la sobrecarga de copia será muy grande)

como el valor de retorno de la función

Por ejemplo: Obtenga los primeros N elementos de la secuencia de Fibonacci

public class TestArray {
    public static int[] fib(int n){
        if(n <= 0){
            return null;
        } 
        int[] array = new int[n];
        array[0] = array[1] = 1;
        for(int i = 2; i < n; ++i){
            array[i] = array[i-1] + array[i-2];
        } 
        return array;
    }
    public static void main(String[] args) {
        int[] array = fib(10);
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

diagrama


ejercicios de matriz

matriz a cadena

ejemplo de código

import java.util.Arrays
int[] arr = {1,2,3,4,5,6};
String newArr = Arrays.toString(arr);
System.out.println(newArr);

// 执行结果
[1, 2, 3, 4, 5, 6]

Es más conveniente usar este método para imprimir la matriz más tarde.

El paquete java.util.Arrays se proporciona en Java, que contiene algunos métodos comunes para manipular matrices.

copia de matriz

import java.util.Arrays;
public class Array {
    public static void main(String[] args) {
        func();
    }

    public static void func(){
// newArr和arr引用的是同一个数组
// 因此newArr修改空间中内容之后,arr也可以看到修改的结果
        int[] arr = {1,2,3,4,5,6};
        int[] newArr = arr;
        newArr[0] = 10;
        System.out.println("newArr: " + Arrays.toString(arr));
// 使用Arrays中copyOf方法完成数组的拷贝:
// copyOf方法在进行数组拷贝时,创建了一个新的数组
// arr和newArr引用的不是同一个数组
        arr[0] = 1;
        newArr = Arrays.copyOf(arr, arr.length);
        System.out.println("newArr: " + Arrays.toString(newArr));
// 因为arr修改其引用数组中内容时,对newArr没有任何影响
        arr[0] = 10;
        System.out.println("arr: " + Arrays.toString(arr));
        System.out.println("newArr: " + Arrays.toString(newArr));
// 拷贝某个范围.
        int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
        System.out.println("newArr2: " + Arrays.toString(newArr2));
    }
}



En este punto, newArr y arr se refieren a la misma matriz, modifique newarr, arr cambiará, esta es una copia superficial

En este momento, use el método copyOf en Arrays para completar la copia de la matriz. El método copyOf crea una nueva matriz al copiar la matriz. Las referencias arr y newArr no son la misma matriz.

El código anterior implica algunos métodos

Arrays.copyOf se usa para copiar matrices

Arrays.copyOfRange se puede usar para copiar un rango de matrices

Arrays.toString convierte una matriz en una cadena

Nota : Cuando el tipo básico de datos se almacena en la matriz, no importa cómo lo copie, no habrá problemas. Sin embargo, si el almacenamiento es un tipo de datos de referencia, debe considerar el problema de la copia profunda y superficial cuando Más adelante le presentaré en detalle acerca de la copia profunda y superficial.

Encuentre el promedio de los elementos en una matriz

Dada una matriz de números enteros, encuentre el promedio

public class Avage {

        public static void main(String[] args) {
            int[] arr = {1,2,3,4,5,6};
            System.out.println(avg(arr));
        }
        public static double avg(int[] arr) {
            int sum = 0;
            for (int x : arr) {
                sum += x;
            }
            return (double)sum / (double)arr.length;
        }

}

Los resultados muestran

Encuentra el elemento especificado en la matriz

búsqueda secuencial

Dada una matriz y dado un elemento, encuentre la posición del elemento en la matriz

ejemplo

   public static void main(String[] args) {
        int[] arr = {1,2,3,10,5,6};
        System.out.println(find(arr, 10));
    }
    public static int find(int[] arr, int data) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == data) {
                return i;
            }
        } 
        return -1; // 表示没有找到
    }

búsqueda binaria

Para arreglos ordenados , se puede usar una búsqueda binaria más eficiente

Matriz ordenada
El orden se divide en "orden ascendente" y "orden descendente"
, como 1 2 3 4, el orden creciente es el orden ascendente.
Por ejemplo, 4 3 2 1, el orden descendente es el orden descendente

Tomando una matriz ascendente como ejemplo, la idea de la búsqueda binaria es tomar primero el elemento en la posición media y luego usar el elemento que se encuentra para compararlo con el elemento central de la matriz.

Si son iguales, se encuentra el subíndice del elemento en el arreglo.
Si es menor que, busca en la mitad izquierda del arreglo de manera similar.
Si es mayor, busca en la mitad derecha del arreglo de manera similar. . 

El código se implementa de la siguiente manera

public class Main {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6};
        System.out.println(binarySearch(arr, 6));
    }
    public static int binarySearch(int[] arr, int toFind) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (toFind < arr[mid]) {
// 去左侧区间找
                right = mid - 1;
            } else if (toFind > arr[mid]) {
// 去右侧区间找
                left = mid + 1;
            } else {
// 相等, 说明找到了
                return mid;
            }
        }
        // 循环结束, 说明没找到
        return -1;
    }
}

Se puede ver que para una búsqueda de matriz con una longitud de 10,000 elementos, la búsqueda binaria solo necesita repetirse 14 veces para completar la búsqueda. A medida que aumenta el número de elementos de la matriz, la ventaja de la búsqueda binaria se vuelve mayor.

Nota: solo para arreglos ordenados

Clasificación de matriz (burbuja)

Dada una matriz, ordenar la matriz en orden ascendente (descendente)

Los bloggers de clasificación de burbujas han hablado sobre todo el proceso en lenguaje C, por lo que no entraré en detalles aquí.

Ideas de algoritmos

Asumiendo orden ascendente:

1. Compare los elementos adyacentes en la matriz de adelante hacia atrás. Si el elemento anterior es más grande que el siguiente, cámbielos. Después de un viaje, el elemento más grande está al final
de la matriz
. 2. Siga el proceso anterior en gire hasta el final de la matriz Todos los elementos están alineados

ejemplo de código 


import java.util.Arrays;
public class Main{
    public static void main(String[] args) {
        int[] arr = {9, 5, 2, 7};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 1; j < arr.length-i; j++) {
                if (arr[j-1] > arr[j]) {
                    int tmp = arr[j - 1];
                    arr[j - 1] = arr[j];
                    arr[j] = tmp;
                }
            }
        } // end for
    } // end bubbleSort
}

La clasificación de burbujas es menos eficiente Hay algoritmos de clasificación más eficientes integrados en Java

Usar de la siguiente manera

public static void main(String[] args) {
    int[] arr = {9, 5, 2, 7};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
}

Orden inverso de la matriz

Dada una matriz, ordenar los elementos en orden inverso

tren de pensamiento

Establezca dos subíndices, apuntando al primer elemento y al último elemento respectivamente. Intercambie los elementos en las dos posiciones.
Luego deje que el subíndice anterior aumente y el último subíndice disminuya, y el ciclo continúa.

ejemplo de código 

import java.util.Arrays;
public class Main{

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void reverse(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left < right) {
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }
}

Matriz bidimensional

Una matriz bidimensional es esencialmente una matriz unidimensional, excepto que cada elemento es una matriz unidimensional.

gramática básica

tipo de datos[][] nombre de matriz = nuevo tipo de datos[número de fila][número de columna] {inicializar datos}; 

nt[][] arr = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
    };
    for (int row = 0; row < arr.length; row++) {
        for (int col = 0; col < arr[row].length; col++) {
            System.out.printf("%d\t", arr[row][col]);
        }
         System.out.println("");
    } 
// 执行结果
1 2 3 4
5 6 7 8
9 10 11 12

 Nota: En el código anterior, encontraremos que usamos el método de longitud cuando accedemos y recorremos la matriz. El primer uso es

arr.longitud

Aquí está la cantidad de elementos contenidos en la matriz bidimensional (matriz unidimensional), es decir, la cantidad de matrices unidimensionales, el segundo uso es

flecha[fila].longitud 

Aquí está el número de elementos contenidos en una matriz unidimensional. Desde aquí también podemos ver que una matriz bidimensional es esencialmente una matriz unidimensional, pero cada elemento es una matriz unidimensional.

No hay una diferencia obvia entre el uso de matrices bidimensionales y matrices unidimensionales, por lo que el blogger no explicará demasiado aquí, y solo hablará sobre algunas diferencias aquí.

for-each atraviesa una matriz binaria

Todavía se necesitan dos capas de bucles aquí. El tipo de elemento de la primera capa de bucle es una matriz unidimensional, por lo que es de tipo int [], y el tipo de elementos en la segunda capa de la matriz unidimensional de bucle es tipo int, por lo que es de tipo int

for (int[] ret : array) {
            for (int x : ret) {
                System.out.print(x+" ");
            }
            System.out.println();
        }

Método Arrays.deepToString 

El método Arrays.deepToString se usa de la misma manera que el método Arrays.toString

Arrays.deepToString convierte una matriz bidimensional en una cadena

Arrays.deepToString(array)

matriz binaria irregular 

Hay arreglos irregulares de dos dígitos en java ¿Qué es un arreglo irregular?

Es decir, la cantidad de elementos en cada fila no es igual, lo que explica perfectamente que una matriz bidimensional es esencialmente una matriz unidimensional, y la cantidad de elementos en una matriz unidimensional no necesita ser igual.

Por ejemplo

 int[][] array = new int[2][];
 array[0] = new int[]{11,22,33,44};
 array[1] = new int[]{111,221,331,441,999,888,777};

Nota: en java, al crear una matriz de dos dígitos, la columna se puede omitir, pero la fila no se puede omitir

Resumir

Este es el final de la explicación de "Una explicación detallada de la recursividad y la Torre de Hanoi". Le invitamos a dejar un mensaje para intercambiar, criticar y corregir. Si el artículo es útil para usted o cree que la escritura del autor no lo es malo, puede hacer clic para seguir, dar me gusta y marcar como favorito para obtener ayuda.

Supongo que te gusta

Origin blog.csdn.net/m0_71731682/article/details/131959052
Recomendado
Clasificación