Jak mogę sprawdzić, czy tablica jest pusta / pusta?

137

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);
}
Ankit Sachan
źródło
Czy mógłbyś przesłać trochę więcej kodu? Przydałby się bit, w którym tablica jest inicjalizowana.
Mark Pope
Nie jestem pewien, o co pytasz. Z pewnością, aby sprawdzić, czy tablica jest pusta, można powiedzieć (array == null)
Paul
7
Nie chcesz, jeśli (k! = Null)
vickirk

Odpowiedzi:

214

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;
  }
}
cletus
źródło
1
ups, ostatni fragment obj !- nullprawdopodobnie miał byćobj != null
user85421
5
Nie zapomnij o: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x
Pamiętaj, że === nie zadziała. Musisz użyć ==, ponieważ nulljest innego typu.
Elijah Mock
98

ArrayUtils.isNotEmpty(testArrayName)z pakietu org.apache.commons.lang3zapewnia, że ​​Array nie ma wartości NULL ani jest pusty

Shravan Ramamurthy
źródło
20

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) { }
Mikrofon
źródło
1
jeśli chcesz sprawdzić zarówno wartość null, jak i długość 0, ważne jest, aby najpierw sprawdzić wartość null, tak jak zrobiłeś, aby uniknąć możliwego błędu wskaźnika zerowego
Bill Milagro
6

Metoda sprawdzania tablicy pod kątem wartości null lub pustej jest również obecna w org.apache.commons.lang:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);
Jackkobec
źródło
5

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");
}
shahkalpesh
źródło
1
W Javie, który się nie skompiluje, ponieważ powie ci, że numbersnie został jeszcze zainicjowany. „Niezainicjowane” i nullto nie to samo.
Joachim Sauer
Dzięki Joachim. Zmienię post, aby int[] numberszmienił się na int[] numbers == null; W C # tak nie jest.
shahkalpesh
2

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.

obiekty
źródło
co jeśli będę musiał sprawdzić null dla liczby całkowitej
Ankit Sachan
1
Nie możesz sprawdzić wartości null za pomocą prymitywów, takich jak int.
obiekty
2
zależy od tego, gdzie go zadeklarowałeś, jeśli jako element klasy, to tak, zostanie zainicjowany zerami. ale gdy zadeklarowano lokalnie w metodzie, uważam, że jest to inny przypadek ... musisz sam przypisać wartość początkową. Przypuszczam. tylko myśl!
ultrajohn
2

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.

hubbabubba
źródło
2

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");
        }   
Uddhav Gautam
źródło
0

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;
}
rozwijać
źródło
0
    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ę

nanatash
źródło
0

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)
Shivang Agarwal
źródło
-1

Wierzę, że to czego chcesz

int[] k = new int[3];

if (k != null) {  // Note, != and not == as above
    System.out.println(k.length);
}

Zaktualizowałeś go, więc nigdy nie będzie zerowy.

vickirk
źródło
-1

Możesz również sprawdzić, czy w tablicy znajdują się jakieś elementy, sprawdzając jej długość, a następnie wstawić ją do instrukcji if-else, aby sprawdzić, czy jest pusta.

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
J_fruitty
źródło