[JAVA] Je suis resté coincé dans un clone d'un tableau à deux dimensions

S'il s'agit d'un tableau unidimensionnel de type primitif ordinaire, vous pouvez le copier avec clone (). S'il s'agit d'un tableau de classes, vous pouvez faire une copie superficielle en clonant (). Ensuite, s'il s'agit d'un tableau bidimensionnel de type primitif ...

clone () d'un tableau bidimensionnel de type int

J'avais l'habitude de créer un autre tableau bidimensionnel et de copier les valeurs, mais quand j'ai vu la source de quelqu'un, j'ai pensé que je pouvais l'écrire en une seule ligne.

	public static void main(String[] args) {
		int[][] map = new int[3][3];
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				map[y][x] = x+y;
			}
		}
		System.out.println("before");
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				System.out.print(map[y][x] + " ");;
			}
			System.out.println("");
		}
		int[][] nmap = map.clone();
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				nmap[y][x] = 4-(x+y);
			}
		}
		System.out.println("after");
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				System.out.print(map[y][x] + " ");;
			}
			System.out.println("");
		}
	}

Quand tu cours

before
0 1 2 
1 2 3 
2 3 4 
after
4 3 2 
3 2 1 
2 1 0 

J'avais l'intention de faire clone () dans nmap, mais map a été réécrite.

Valeur de hachage du tableau

Essayez de sortir la valeur de hachage de int [].

	public static void main(String[] args) {
		int[][] map = new int[3][3];
		System.out.println("before");
		for (int y=0; y<3; y++) {
			System.out.println(map[y]);
		}
		int[][] nmap = map.clone();
		System.out.println("after");
		for (int y=0; y<3; y++) {
			System.out.println(nmap[y]);
		}
	}

Quand tu cours

before
[I@15db9742
[I@6d06d69c
[I@7852e922
after
[I@15db9742
[I@6d06d69c
[I@7852e922

C'est le même. Si vous y réfléchissez bien, c'est naturel, mais comme int [] est un type de référence, c'est une copie superficielle.

Boucle et clone () un tableau unidimensionnel

Puis clone () int [].

	public static void main(String[] args) {
		int[][] map = new int[3][3];
		System.out.println("before");
		for (int y=0; y<3; y++) {
			System.out.println(map[y]);
		}
		int[][] nmap = new int[3][];
		for (int y=0; y<3; y++) {
			nmap[y] = map[y].clone();
		}
		System.out.println("after");
		for (int y=0; y<3; y++) {
			System.out.println(nmap[y]);
		}
	}

Quand tu cours

before
[I@15db9742
[I@6d06d69c
[I@7852e922
after
[I@4e25154f
[I@70dea4e
[I@5c647e05

Cette fois c'est bon.

Essayez de cloner () la première source sous forme de tableau unidimensionnel

Essayez clone () avec int [].

	public static void main(String[] args) {
		int[][] map = new int[3][3];
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				map[y][x] = x+y;
			}
		}
		System.out.println("before");
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				System.out.print(map[y][x] + " ");;
			}
			System.out.println("");
		}
		int[][] nmap = new int[3][];
		for (int y=0; y<3; y++) {
			nmap[y] = map[y].clone();
		}
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				nmap[y][x] = 4-(x+y);
			}
		}
		System.out.println("after");
		for (int y=0; y<3; y++) {
			for (int x=0; x<3; x++) {
				System.out.print(map[y][x] + " ");;
			}
			System.out.println("");
		}
	}

Quand tu cours

before
0 1 2 
1 2 3 
2 3 4 
after
0 1 2 
1 2 3 
2 3 4 

nmap est une copie de map.

Résumé

Les tableaux bidimensionnels ne peuvent pas être clonés () sur une seule ligne. Même si vous l'écrivez dans la source de quelqu'un, rien ne garantit qu'il est correct.

Recommended Posts

Je suis resté coincé dans un clone d'un tableau à deux dimensions
Je suis resté coincé dans le fichier
[JAVA] Project Euler, je suis resté coincé au Q8, alors prenez note
Où je suis resté coincé dans le "tutoriel sur les rails" d'aujourd'hui (08/10/20)
Coincé devant le forgeron par enum
Où je suis resté coincé dans le "tutoriel des rails" d'aujourd'hui (05/10/2020)
Où je suis resté coincé dans le "tutoriel des rails" d'aujourd'hui (06/10/20)
Où je suis resté coincé dans le "tutoriel sur les rails" d'aujourd'hui (04/10/20)
Où je suis resté coincé dans le "tutoriel sur les rails" d'aujourd'hui (07/10/20)
J'ai un symbole de résolution impossible dans Android Studio
[Ruby] Extraction d'un tableau à deux dimensions
Multiplication dans un tableau Ruby
J'étais confus parce qu'il y avait une scission dans le tableau
J'ai créé un client RESAS-API en Java
Lorsque je suis passé à IntelliJ, il y avait une grande différence dans l'encodage du fichier de propriétés.
[Note personnelle] Rétrospective de ce que je suis resté coincé dans Docker ... y compris la connaissance de Linux
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
J'ai créé un PDF avec Java.
Convertir un tableau de chaînes en une liste d'entiers en Java
Restez coincé dans un Java Primer
J'ai construit un environnement de rails avec docker et mysql, mais j'étais malade
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
Augmenter dynamiquement le nombre d'éléments dans un tableau bidimensionnel Java (tableau multidimensionnel)
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
Je suis resté coincé en utilisant un cas de serpent pour le nom de variable dans Spring Boot
Je veux ForEach un tableau avec une expression Lambda en Java
Extraire les éléments d'un tableau / extraire dans l'ordre inverse-java
J'ai essayé un problème de calendrier avec Ruby
Lors de la recherche de plusieurs dans un tableau Java
J'étais accro au @Transactional de Spring
J'ai essayé d'incorporer une formule dans Javadoc
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
12 du tableau
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
J'ai fait un exemple de la façon d'écrire un délégué dans Swift UI 2.0 à l'aide de MapKit
J'ai créé un programme de jugement des nombres premiers en Java
Mesurer la taille d'un dossier avec Java
Je suis resté coincé en essayant le processus de synchronisation de Volley (Java)
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai créé un jeu Janken en Java (CLI)
J'ai essayé de créer une application de clonage LINE
J'ai créé une bibliothèque d'extension Ruby en C
Un examen rapide de Java appris en classe
J'ai écrit un programme de factorisation prime en Java
Collection RSpec que j'ai fréquemment utilisée
Résumé de ce que j'ai appris dans Spring Batch
Comment trouver la valeur totale, la valeur moyenne, etc. d'un tableau à deux dimensions (tableau multidimensionnel) -java
Je déteste ce genre de code! Une collection d'anti-motifs réellement vus sur le terrain
Une histoire sur une erreur lors de la migration dans docker PHP Laravel
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé