Як я можу перевірити, чи масив є нульовим / порожнім?


137

У мене є intмасив, у якого немає елементів, і я намагаюся перевірити, чи порожній він.

Наприклад, чому умова твердження if у наведеному нижче коді ніколи не відповідає дійсності?

int[] k = new int[3];

if (k == null) {
    System.out.println(k.length);
}

Чи можете ви опублікувати трохи більше коду? Біт, де ініціалізований масив, було б корисно побачити.
Познач Папу

Я не впевнений, про що ви питаєте. Звичайно, щоб перевірити, чи масив є нульовим, можна було б сказати (масив == null)
Павло,

7
Не хочете, якщо (k! = Null)
vickirk

Відповіді:


214

Існує ключова різниця між nullмасивом і порожнім масивом. Це тест на null.

int arr[] = null;
if (arr == null) {
  System.out.println("array is null");
}

"Порожня" тут не має офіційного значення. Я вирішую визначити порожній як такий, що містить 0 елементів:

arr = new int[0];
if (arr.length == 0) {
  System.out.println("array is empty");
}

Альтернативне визначення поняття "порожній" - це якщо всі елементи null:

Object arr[] = new Object[10];
boolean empty = true;
for (int i=0; i<arr.length; i++) {
  if (arr[i] != null) {
    empty = false;
    break;
  }
}

або

Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
  if (ob != null) {
    empty = false;
    break;
  }
}

1
ups, останній фрагмент obj !- null, мабуть, мав бутиobj != null
користувач85421

5
Не забувайте про: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x

Пам’ятайте, === не працює. Ви повинні використовувати ==, тому що nullмає інший тип.
Ілля Мок


20

Подивіться на його довжину:

int[] i = ...;
if (i.length == 0) { } // no elements in the array

Хоча одночасно перевіряти наявність нуля безпечніше:

if (i == null || i.length == 0) { }

1
якщо вам потрібно перевірити як null, так і довжину 0, важливо спершу перевірити наявність null, як ви це зробили, щоб уникнути можливої ​​помилки нульового вказівника
Bill Milagro

6

Метод перевірки масиву на нульовий або порожній також присутній на org.apache.commons.lang:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

5

Я з .net фону. Однак java / c # більш / менш однакові.

Якщо ви інстанціюєте непомітивний тип (масив у вашому випадку), він не буде нульовим.
Наприклад, int[] numbers = new int[3];
у цьому випадку виділяється простір, і кожен елемент має значення за замовчуванням 0.

Це буде null, коли ви цього не зробите new.
напр

int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}

1
У Java це не компілюється, тому що воно скаже вам, що numbersще не було ініціалізовано. "Неініціалізовані" і nullце не одне і те ж.
Йоахім Зауер

Дякую Йоахіму. Я відредагую публікацію, яку я int[] numbersзмінив int[] numbers == null; У c # це не так.
шахкалпеш

2

Масив int ініціалізується з нулем, тому він фактично ніколи не містить нулів. Лише масиви Об'єктів спочатку містять нуль.


що робити, якщо мені доведеться перевірити нуль на ціле число
Анкіт Сачан

1
Ви не можете перевірити наявність нуля з примітивами, такими як int.
об’єкти

2
залежить від того, де ви це оголосили, якщо як член класу, то так, його ініціалізують з нулями. але коли оголошено локально всередині методу, я вважаю, що це вже інший випадок ... ви повинні призначити початкове значення самостійно. Я вважаю. просто думка!
ultrajohn

2

Суть тут дуже просто в тому, що змінна k не є нульовою, оскільки вона вказує на масив. Не має значення, що сам масив порожній. Нульовий тест у вашій публікації оцінить справжній лише тоді, коли змінна k ні на що не вказувала.


2

Я тестував, як показано нижче. Сподіваюся, це допомагає.

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");
        }   

0

intМасив без елементів не обов'язково null. Це буде лише в тому nullвипадку, якщо його ще не було виділено. Дивіться цей підручник для отримання додаткової інформації про масиви Java.

Ви можете перевірити довжину масиву:

void foo(int[] data)
{
  if(data.length == 0)
    return;
}

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;
}

Це так само, як я підходив до перевірки чи порожній масив int порожній. Хоча це не буде працювати, коли входи в масиві фактично дорівнюють нулю. Він буде працювати для {1,2,3}, і він все одно поверне помилкове значення, якщо {2,0}, але {0} повернеться вірно


0

У Java 8+ ви цього досягаєте за допомогою методу потоків allMatch.

Для примітивних:

int[] k = new int[3];
Arrays.stream(k).allMatch(element -> element != 0)

Для об’єкта:

Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)

-1

Я вважаю, що те, що ти хочеш

int[] k = new int[3];

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

Ви створили його так, що він ніколи не буде нульовим.


-1

Ви також можете перевірити, чи є в масиві якісь елементи, дізнавшись його довжину, а потім помістити його в оператор if-else, щоб перевірити, чи він є нульовим.

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.