ฉันจะตรวจสอบได้อย่างไรว่าอาร์เรย์เป็นโมฆะ / ว่างเปล่า


140

ฉันมีintอาร์เรย์ที่ไม่มีองค์ประกอบและฉันกำลังพยายามตรวจสอบว่าว่างหรือไม่

ตัวอย่างเช่นเหตุใดเงื่อนไขของ if-statement ในโค้ดด้านล่างจึงไม่เป็นจริง

int[] k = new int[3];

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

ช่วยโพสต์โค้ดอีกหน่อยได้ไหม บิตที่เริ่มต้นอาร์เรย์จะเป็นประโยชน์ในการดู
Mark Pope

ฉันไม่แน่ใจว่าคุณถามอะไร เพื่อตรวจสอบว่าอาร์เรย์เป็นโมฆะหรือไม่เราจะพูดว่า (array == null)
พอล

7
คุณไม่ต้องการถ้า (k! = null)
vickirk

คำตอบ:


220

มีความแตกต่างที่สำคัญระหว่าง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
อัพตัวอย่างสุดท้ายobj !- nullน่าจะเป็นobj != null
user85421

5
อย่าลืมเกี่ยวกับ: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x

จำไว้ว่า === จะไม่ทำงาน คุณต้องใช้ == เนื่องจากnullเป็นประเภทอื่น
Elijah Mock

101

ArrayUtils.isNotEmpty(testArrayName)จากแพ็คเกจorg.apache.commons.lang3ทำให้แน่ใจว่า Array ไม่เป็นโมฆะหรือว่างเปล่า


20

ดูความยาว:

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

แม้ว่าจะปลอดภัยกว่าในการตรวจสอบค่าว่างในเวลาเดียวกัน:

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

2
หากคุณต้องการตรวจสอบทั้งโมฆะและความยาว 0 สิ่งสำคัญคือต้องตรวจสอบค่าว่างก่อนตามที่คุณได้ทำเพื่อหลีกเลี่ยงข้อผิดพลาดของตัวชี้ที่เป็นโมฆะที่อาจเกิดขึ้น
Bill Milagro

8

วิธีการตรวจสอบอาร์เรย์ว่าว่างหรือว่างยังมีอยู่ใน org.apache.commons.lang:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

4

ฉันมาจากพื้นหลัง. 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ยังไม่ได้เริ่มต้น "Uninitialized" และnullไม่ใช่สิ่งเดียวกัน
Joachim Sauer

ขอบคุณ Joachim ฉันจะแก้ไขโพสต์ให้int[] numbersเปลี่ยนเป็นint[] numbers == null; ใน c # ไม่เป็นเช่นนั้น
shahkalpesh

2

int อาร์เรย์เริ่มต้นด้วยศูนย์ดังนั้นจึงไม่เคยมีค่าว่าง อาร์เรย์ของ Object เท่านั้นที่จะมีค่า null ในตอนแรก


จะเกิดอะไรขึ้นถ้าฉันต้องตรวจสอบ null สำหรับจำนวนเต็ม
Ankit Sachan

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

1

ใน 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)

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 ว่างเปล่า แม้ว่าสิ่งนี้จะไม่ทำงานเมื่อ ints ในอาร์เรย์เป็นศูนย์จริงๆ จะใช้งานได้กับ {1,2,3} และจะยังคงส่งคืนเท็จหาก {2,0} แต่ {0} จะคืนค่าเป็นจริง


-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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.