Bir dizinin boş / boş olup olmadığını nasıl kontrol edebilirim?


137

intÖğeleri olmayan bir dizi var ve boş olup olmadığını kontrol etmeye çalışıyorum.

Örneğin, aşağıdaki koddaki if-ifadesinin durumu neden asla doğru değil?

int[] k = new int[3];

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

Kodu biraz daha gönderebilir misiniz lütfen? Dizinin başlatıldığı biti görmek yararlı olacaktır.
Mark Pope

Ne istediğinden emin değilim. Bir dizinin boş olup olmadığını kontrol etmek için Surelly biri söylenir (array == null)
Paul

7
Eğer istemiyorsanız (k! = Null)
vickirk

Yanıtlar:


214

Bir nulldizi ile boş bir dizi arasında önemli bir fark vardır . Bu bir test null.

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

"Boş" burada resmi bir anlamı yok. Boş öğeyi 0 öğeye sahip olarak tanımlamayı seçiyorum:

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

"Boş" seçeneğinin alternatif bir tanımı, tüm öğelerin null:

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

veya

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

1
ups, son snippet obj !- null, muhtemelen olması gerekiyorduobj != null
user85421

5
Unutmayın: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x

Unutmayın, === işe yaramaz. nullFarklı bir tür olduğundan == kullanmalısınız .
Elijah Mock

98

ArrayUtils.isNotEmpty(testArrayName)pakette org.apache.commons.lang3Array'ın boş veya boş olmamasını sağlar


20

Uzunluğuna bakın:

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

Null'u aynı anda kontrol etmek daha güvenli olmasına rağmen:

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

1
hem null hem de 0 uzunluğunu kontrol etmeniz gerekiyorsa, olası bir boş işaretçi hatasını önlemek için önce yaptığınız gibi null olup olmadığını kontrol etmek önemlidir
Bill Milagro

6

Dizi boş veya boş olup olmadığını denetleme yöntemi de org.apache.commons.lang adresinde bulunmaktadır:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

5

Ben .net kökenliyim. Ancak, java / c # aşağı yukarı aynıdır.

İlkel olmayan bir türü (durumunuzdaki dizi) başlatırsanız, bu değer boş olmaz.
Örneğin int[] numbers = new int[3];
, bu durumda, alan ayrılır ve öğenin her birinin varsayılan değeri 0 olur.

Yapmadığın nullzaman olacak new.
Örneğin

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'da derlenmeyecektir, çünkü numbershenüz başlatılmadığını size söyleyecektir . "Başlatılmamış" ve nullaynı şey değil.
Joachim Sauer

Teşekkürler Joachim. Ben var Yayını düzenleyerek olacak int[] numbersdeğiştirildi int[] numbers == null; C # 'da böyle değildir.
shahkalpesh

2

Bir int dizisi sıfır ile başlatılır, bu yüzden aslında hiç null içermez. Başlangıçta yalnızca Object dizileri boş olacaktır.


tamsayı için null değerini kontrol etmek zorunda
kalırsam

1
İnt gibi ilkellerle null olup olmadığını kontrol edemezsiniz.
nesneler

2
Nerede bildirdiğinize bağlıdır, eğer sınıf üyesi olarak evetse sıfırlarla başlatılır. ancak yerel olarak bir yöntem içinde bildirildiğinde, başka bir durum olduğuna inanıyorum ... kendiniz bir başlangıç ​​değeri atamanız gerekiyor. sanırım. Sadece bir düşünce!
ultrajohn

2

Buradaki nokta, k değişkeninin diziyi işaret ettiği için boş olmamasıdır. Dizinin kendisinin boş olması önemli değil. Gönderinizdeki null testi yalnızca k değişkeni hiçbir şeye işaret etmiyorsa doğru olarak değerlendirilir.


2

Aşağıdaki gibi test ettim. Umarım yardımcı olur.

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Öğeleri olmayan bir dizi olması gerekmez null. Sadece nullhenüz tahsis edilmemişse olacaktır. Java dizileri hakkında daha fazla bilgi için bu eğiticiye bakın .

Dizinin uzunluğunu test edebilirsiniz:

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

Bu bir int dizi boş olup olmadığını kontrol etmek lazım kadar yakın. Dizideki ints aslında sıfır olduğunda bu çalışmaz. {1,2,3} için çalışacak ve {2,0} ancak {0} doğru dönecekse yine de yanlış dönecektir


0

Java 8+ sürümünde bunu allMatch akışları yardımıyla elde edersiniz.

İlkel için:

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

Nesne için:

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

-1

İstediğine inanıyorum

int[] k = new int[3];

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

Onu yeniledin, bu yüzden asla boş kalmayacaktı.


-1

Ayrıca, uzunluğunu bularak dizide herhangi bir öğe olup olmadığını kontrol edebilir, ardından boş olup olmadığını kontrol etmek için if-else ifadesine koyabilirsiniz.

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.