/ / Proste pomijanie tablicy - java, arrays

Proste pomniejszanie chaosu tablicy - java, tablice

Próbuję zrobić prostą małą metodę w Javiektóry stworzy listę malejących wartości całkowitych z dowolnego wejścia, które mu podam (np. jeśli N = 10, zwróci tablicę: {10,9,8,7,6,6,5,4,3, 2,1} Jest to niewielka część mojego kodu i kompiluje się poprawnie, ale otrzymuję wyjątki wskaźnika zerowego podczas wykonywania. Czy jest jakiś problem, który wyróżnia się w poniższym kodzie?

private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = N; i > 1; i--) {
int q = 0;
a[q] = i;
q++;
}
return a;
}  `

Odpowiedzi:

1 dla odpowiedzi № 1

Nie powinieneś otrzymywać wyjątku zerowego wskaźnika, twój kod ma wyjątek indeksowania poza zakresem. Dzieje się tak, ponieważ uruchamiasz swój i od N aż do 1, wyłączne, podczas gdy powinno iść N-1 aż do 0:

for(int i = N-1, q=0; i >= 0; i--, q++) {
a[q] = i+1;
}

Uwaga jak q i i można zadeklarować w nagłówku pętli.

Możesz przepisać tę pętlę bez q także:

for(int i = 0 ; i != N ; i++) {
a[q] = N-i;
}

1 dla odpowiedzi nr 2

Inicjujesz q przy każdej iteracji 0. Dlaczego nie

private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = N; i >= 1; i--) {
a[i-1] = N - i + 1;
}

return a;
}

Ewentualnie możesz użyć

 private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
for(int i = 0; i < N; i++) {
a[i] = N - i;
}

return a;
}

Które jest prawdopodobnie jaśniejsze


0 dla odpowiedzi № 3

Wielokrotnie nadpisujesz pozycję 0 twojej tablicy, powtarzając wielokrotnie q. Oto poprawka:

private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = N; i > 1; i--) {
a[q] = i;
q++;
}
return a;
}

0 dla odpowiedzi nr 4

N jest górną granicą. Tablice w Javie o rozmiarze N są indeksowane od 0 do N-1. Więc kiedy odwołujesz się do [N], będzie to odwoływać się do indeksu poza zakresem.


0 dla odpowiedzi № 5

Twój kod w obecnej postaci zwróci tablicę rozmiarów N ale tylko pierwszy element tablicy zostanie zaktualizowany dziesięć razy. Oto dlaczego, gdy przechodzimy przez logikę twojego programu,

create an array of type Integer, sized N
First iteration:
for-loop starts at i=N, let"s make N = 10 for our purposes
q is set to 0 and a[0] is updated to N, which is 10 in the first iteration
q is incremented to 1
i is decremented to 9
Second iteration:
i is now 9
q is set to 0 and a[0] is set to 9
q is incremented to 1
i is decremented to 8

W tym momencie widzimy problem. Możesz tak myśleć q w drugiej iteracji powinien zaczynać się od 1 i być zwiększany do 2 po aktualizacji a[1] i nie a[0], ale tak nie jest. Z każdą iteracją pętli for nowej zmiennej q jest zrobione. Po zakończeniu iteracji zmienna q to śmieci zbierane / wyrzucane. Dlatego rozwiązaniem jest użycie zmiennej, która nie jest wyrzucana po każdej iteracji pętli for. Użyjmy więc i zamiast tego uzyskać dostęp do określonego indeksu w tablicy od

1) ta sama zmienna i można uzyskać dostęp za pomocą każdej iteracji pętli i

2) zmienna i jest automatycznie zwiększany lub zmniejszany na końcu każdej iteracji w zależności od nagłówka pętli

Zastosowanie tych zmian spowoduje, że

private static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = 0; i < N; i++) {
a[i] = N - i;
}
return a;
}

0 dla odpowiedzi № 6

Twój kod powinien wyglądać tak:

public static Integer[] descendingIntegerArray(int N) {
Integer[] a = new Integer[N];
int q = 0;
for(int i = N - 1; i >= 0; i--) {
a[q] = i + 1;
q++;
}
return a;
}

Musisz zainicjować q poza pętlą for, ponieważ za każdym razem, gdy się zapętli, q jest inicjowane zerem i staje się [0] = 10, a [0] = 9 itd. ...