मैं कैसे जांच सकता हूं कि कोई सरणी रिक्त / रिक्त है या नहीं?


137

मेरे पास एक intसरणी है जिसमें कोई तत्व नहीं है और मैं यह जांचने की कोशिश कर रहा हूं कि क्या यह खाली है।

उदाहरण के लिए, नीचे दिए गए कोड में if-statement की स्थिति कभी सच क्यों नहीं है?

int[] k = new int[3];

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

क्या आप कृपया कोड के कुछ और पोस्ट कर सकते हैं? बिट जहां सरणी आरंभीकृत होती है वह देखने के लिए उपयोगी होगी।
मार्क पोप

मुझे यकीन नहीं है कि आपका क्या पूछना है। निश्चित रूप से जाँच करने के लिए कि क्या कोई सरणी अशक्त है (सरणी == नल) कहेंगे
पॉल

7
क्या आप नहीं चाहते हैं (k!
Null

जवाबों:


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
अप, आखिरी स्निपेट obj !- null, संभवतः होने का मतलब हैobj != null
user85421

5
इसके बारे में मत भूलना:
org.apache.commons.lang3.ArrayUtils.isEmpty

याद रखें, === काम नहीं करेगा। आपको == का उपयोग करना चाहिए क्योंकि nullएक अलग प्रकार का है।
एलिय्याह मॉक


20

इसकी लंबाई देखें:

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

हालांकि यह एक ही समय में अशक्त के लिए जाँच करने के लिए सुरक्षित है:

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

1
यदि आपको अशक्त और लंबाई दोनों के लिए जाँच करने की आवश्यकता है, तो पहले नल के लिए जाँच करना महत्वपूर्ण है, जैसा कि आपने किया है, एक संभावित अशक्त सूचक त्रुटि से बचने के लिए
बिल मिलग्रो

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
जावा में, जो संकलन नहीं करेगा, क्योंकि यह आपको बताएगा कि numbersअभी तक आरंभ नहीं किया गया है। "Uninitialized" और nullसमान चीज़ नहीं हैं।
जोकिम सॉर

धन्यवाद जोआचिम। मैं उस पोस्ट को संपादित करूंगा जिसे int[] numbersबदल दिया गया है int[] numbers == null; सी # में, यह मामला नहीं है।
शाहकलेश

2

एक इंट सरणी को शून्य से आरंभ किया जाता है इसलिए यह वास्तव में कभी नल नहीं होगा। ऑब्जेक्ट के केवल सरणियों में शुरुआत में अशक्त होगा।


क्या होगा अगर मुझे पूर्णांक के लिए नल की जांच करनी है
अंकित सचान

1
आप इस तरह के रूप में आदिम के साथ अशक्त के लिए जाँच नहीं कर सकते।
वस्तुओं

2
निर्भर करता है कि आपने इसे कहां घोषित किया है, अगर एक वर्ग के सदस्य के रूप में, तो हाँ यह शून्य के साथ आरंभिक है। लेकिन जब एक विधि के अंदर स्थानीय रूप से घोषित किया जाता है, तो मेरा मानना ​​है कि यह एक और मामला है ... आपको स्वयं एक प्रारंभिक मूल्य आवंटित करना होगा। मुझे लगता है। सिर्फ एक विचार!
अल्ट्रोज़ोन

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जब इसे अभी तक आवंटित नहीं किया गया हो। जावा सरणियों के बारे में अधिक जानकारी के लिए इस ट्यूटोरियल को देखें ।

आप सरणी की लंबाई का परीक्षण कर सकते हैं:

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

यह उतना ही करीब है जितना कि मुझे पता चल गया है कि क्या कोई इंट सरणी खाली है। हालाँकि यह तब काम नहीं करेगा जब सरणी में चींटियाँ वास्तव में शून्य हों। यह {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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.