Mám nasledujúce 2D pole:
private static Object[][] myClass = new Object[6][5];
a hľadám null posledný prvok v poli (myClass[lastIndex][all indexes] = null
) pomocou nasledujúceho kódu:
for(int y = 0;y < 5;y++) {
myClass[5][y] = null;
}
Zdá sa však, že sa odstránia posledné dva prvky v poli, čo to spôsobuje?
EDIT:
pole pred vytlačením:
one
1
1
1
1.0
two
2
2
2
2.0
three
3
3
3
3.0
four
4
4
4
4.0
five
5
5
5
5.0
six
6
6
6
6.0
Po "vymazaní" prvku one
(V praxi chcem "odstrániť" prvok jeden skopírovaním všetkých prvkov nadol jedným indexom a nastavením posledného na nulový):
two
2
2
2
2.0
three
3
3
3
3.0
four
4
4
4
4.0
five
5
5
5
5.0
null
null
null
null
null
null
null
null
null
null
Môj úplný kód na odstránenie:
public void deleteStudent(int studentChoice) {
for(int i = studentChoice;i < myClass.length - 1;i++) {
myClass[i] = myClass[i+1];
}
myClassCount = myClassCount - 1;
for(int y = 0;y < 5;y++) {
myClass[5][y] = null;
}
}
int studentChoice
je index poľa.
myClassCount
je premenná, ktorá sa s prírastkom / vymazaním prvkov zvýši
odpovede:
1 pre odpoveď č. 1Ide o jemný problém: Keď skopírujete nadol, odkazy sa skopírujú, nie hodnoty v poli tak, že v poslednom kroku, pretože don "t prepísať myClass [5], myClass [5] == myClass [4] tak, aby vás všetky zmeny potom zmenili make to any element v myClass [5] sa replikujú v myClass [4], pretože sú to isté objekty! Preto keď null každý objekt v myClass [5], vymaľete všetko v myClass [4]. skopírovaním jednotlivých hodnôt nadol, a nie iba polí.
Hodnoty môžete kopírovať takto:
for(int i = studentChoice;i < myClass.length - 1;i++) {
for(int y = 0;y < 5;y ++){
myClass[i][y] = myClass[i+1][y];
}
}
Ako vedľajšia poznámka toto správanie možno preukázať nasledujúcimi spôsobmi:
Object[] array1 = {1};
Object[] array2 = array1;
array2[0] = 2;
System.out.println(array1[0]);//Prints 2