Mam inttablicę bez elementów i próbuję sprawdzić, czy jest pusta.
Na przykład, dlaczego warunek instrukcji if w poniższym kodzie nigdy nie jest prawdziwy?
int[] k = new int[3];
if (k == null) {
System.out.println(k.length);
}
Mam inttablicę bez elementów i próbuję sprawdzić, czy jest pusta.
Na przykład, dlaczego warunek instrukcji if w poniższym kodzie nigdy nie jest prawdziwy?
int[] k = new int[3];
if (k == null) {
System.out.println(k.length);
}
Odpowiedzi:
Istnieje zasadnicza różnica między nulltablicą a pustą tablicą. To jest test dla null.
int arr[] = null;
if (arr == null) {
System.out.println("array is null");
}
„Pusty” nie ma tutaj oficjalnego znaczenia. Zdecydowałem się zdefiniować pusty jako mający 0 elementów:
arr = new int[0];
if (arr.length == 0) {
System.out.println("array is empty");
}
Alternatywną definicją „pustego” jest to, że wszystkie elementy są null:
Object arr[] = new Object[10];
boolean empty = true;
for (int i=0; i<arr.length; i++) {
if (arr[i] != null) {
empty = false;
break;
}
}
lub
Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
if (ob != null) {
empty = false;
break;
}
}
obj !- nullprawdopodobnie miał byćobj != null
nulljest innego typu.
ArrayUtils.isNotEmpty(testArrayName)z pakietu org.apache.commons.lang3zapewnia, że Array nie ma wartości NULL ani jest pusty
Spójrz na jego długość:
int[] i = ...;
if (i.length == 0) { } // no elements in the array
Chociaż bezpieczniej jest sprawdzić wartość null w tym samym czasie:
if (i == null || i.length == 0) { }
Jestem z tła .net. Jednak java / c # są mniej więcej takie same.
Jeśli utworzysz wystąpienie typu innego niż pierwotny (w twoim przypadku tablica), nie będzie on miał wartości null.
np. w int[] numbers = new int[3];
tym przypadku przestrzeń jest przydzielana i każdy element ma domyślną wartość 0.
Będzie null, kiedy tego nie zrobisz new.
na przykład
int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
System.out.println("yes, it is null. Please new it up");
}
numbersnie został jeszcze zainicjowany. „Niezainicjowane” i nullto nie to samo.
int[] numberszmienił się na int[] numbers == null; W C # tak nie jest.
Tablica int jest inicjalizowana zerem, więc w rzeczywistości nigdy nie będzie zawierała wartości null. Tylko tablice Object będą początkowo zawierać wartość null.
Chodzi tu po prostu o to, że zmienna k nie jest pusta, ponieważ wskazuje na tablicę. Nie ma znaczenia, że sama tablica jest pusta. Test zerowy w Twoim poście dałby wartość true tylko wtedy, gdyby zmienna k nic nie wskazywała.
Testowałem jak poniżej. Mam nadzieję, że to pomoże.
Integer[] integers1 = new Integer[10];
System.out.println(integers1.length); //it has length 10 but it is empty. It is not null array
for (Integer integer : integers1) {
System.out.println(integer); //prints all 0s
}
//But if I manually add 0 to any index, now even though array has all 0s elements
//still it is not empty
// integers1[2] = 0;
for (Integer integer : integers1) {
System.out.println(integer); //Still it prints all 0s but it is not empty
//but that manually added 0 is different
}
//Even we manually add 0, still we need to treat it as null. This is semantic logic.
Integer[] integers2 = new Integer[20];
integers2 = null; //array is nullified
// integers2[3] = null; //If I had int[] -- because it is priitive -- then I can't write this line.
if (integers2 == null) {
System.out.println("null Array");
}
intTablicy bez elementów nie jest z konieczności null. Będzie tylko nullwtedy, gdy nie został jeszcze przydzielony. Zobacz ten samouczek, aby uzyskać więcej informacji na temat tablic Java.
Możesz przetestować długość tablicy:
void foo(int[] data)
{
if(data.length == 0)
return;
}
public boolean empty() {
boolean isEmpty = true;
int i = 0;
for (int j = 0; j < array.length; j++) {
if (array[j] != 0) {
i++;
}
}
if (i != 0) {
isEmpty = false;
}
return isEmpty;
}
Jest to tak blisko, jak mogłem sprawdzić, czy tablica int jest pusta. Chociaż to nie zadziała, gdy wartości int w tablicy są w rzeczywistości równe zero. Będzie działać dla {1, 2, 3} i nadal zwróci fałsz, jeśli {2,0}, ale {0} zwróci prawdę
W Javie 8+ osiąga się to za pomocą metody streams allMatch.
Dla prymitywów:
int[] k = new int[3];
Arrays.stream(k).allMatch(element -> element != 0)
Dla obiektu:
Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)