सभी ऐरर तत्वों को शून्य करने के लिए कोई शॉर्टकट?


281

में C/C++करता था

int arr[10] = {0};

... मेरे सभी सरणी तत्वों को प्रारंभ करने के लिए 0।

क्या जावा में समान शॉर्टकट है?

मैं लूप का उपयोग करने से बचना चाहता हूं, क्या यह संभव है?

int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
    arr[i] = 0;
}

2
java.util.Arrays.fill () int [] arr = new int [10]; और इंट अरेस्ट [10] = {0}; सभी आंतरिक छोरों का उपयोग करते हैं।
केविन कोस्टलन

जवाबों:


574

अभिन्न प्रकारों के सरणियों के लिए 0 का एक डिफ़ॉल्ट मान भाषा युक्ति द्वारा गारंटीकृत है :

प्रत्येक वर्ग चर, उदाहरण चर, या सरणी घटक को एक डिफ़ॉल्ट मान के साथ प्रारंभ किया जाता है जब इसे बनाया जाता है (§15.9, ...15.10) [...] प्रकार के लिए int, डिफ़ॉल्ट मान शून्य है, अर्थात 0।  

यदि आप किसी एक-आयामी सरणी को किसी भिन्न मान से प्रारंभ करना चाहते हैं, तो आप java.util.Arrays.fill () का उपयोग कर सकते हैं (जो बेशक आंतरिक रूप से एक लूप का उपयोग करेगा)।


@MichaelBorgwardt मेरे लिए उपयोगी उत्तर था। क्या लूप की तुलना में इसे करने की लागत समान होगी?
मेथम-ɯɐɥʇʎɐɯ

@ maytham-ɯɐɥıλɐɯ: आप स्रोत कोड को देख सकते हैं, यह JDK के साथ आता है। यह बिल्कुल वैसा ही है, इस विधि में लूप के लिए कुछ भी नहीं है, बल्कि बिल्कुल सामान्य है।
माइकल बोर्गवर्ड

@MichaelBorgwardt एक स्थानीय 2-आयामी सरणी के मूल्यों के बारे में क्या? क्या यह "सरणी घटक" के अंतर्गत आता है?
ऋषि

Arrays.fillजरूरी नहीं कि एक लूप का उपयोग करें।
नैट्स

@ नेट्स: क्या आप जावा कार्यान्वयन का एक उदाहरण दे सकते हैं जो नहीं करता है?
माइकल बोर्गवर्ड

104

जबकि अन्य उत्तर सही हैं (इंट सरणी मान 0 से शुरू में डिफ़ॉल्ट रूप से हैं), यदि आप स्पष्ट रूप से ऐसा करना चाहते थे (उदाहरण के लिए मान लें कि यदि आप मान 42 से भरा सरणी चाहते हैं), तो आप भरण () विधि का उपयोग कर सकते हैं सरणी वर्ग:

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);

या यदि आप 1-लाइनर्स के प्रशंसक हैं, तो आप Collections.nCopies()दिनचर्या का उपयोग कर सकते हैं :

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);

गिरफ्तारी मूल्य देगा:

[42, 42, 42]

(हालांकि यह है Integer, और नहीं int, अगर आपको आदिम प्रकार की आवश्यकता है तो आप अपाचे कॉमन्सArrayUtils.toPrimitive() रूटीन को स्थगित कर सकते हैं :

int [] primarr = ArrayUtils.toPrimitive(arr);

9
वन-लाइनर अच्छे हैं, लेकिन List<Integer>करने के Integer[]लिए int[]? यह थोड़ा जटिल है।
धारी

2
@ डेडी श्योर, लेकिन यही कारण है कि उत्तर में 2-लाइन संस्करण भी है (यदि आप "जटिल" कारक के बारे में चिंतित हैं)।
एडम पार्किं

Arrays.fillविधि के साथ 2d सरणी को प्रारंभ करना समस्या पैदा कर रहा है और त्रुटि उत्पन्न होती है।
AKS

39

जावा में सभी तत्वों (आदिम पूर्णांक प्रकार byte short, int, long) 0 करने के लिए डिफ़ॉल्ट रूप से initialised कर रहे हैं। आप लूप को बचा सकते हैं।


2
मुझे लगता है कि यह आदिम प्रकारों के लिए रखती है ?!
ओलपिम्पू पीओपी

1
आदिम जावा प्रकार, जैसे इंट, प्रारंभिक नहीं हैं।
मिरको एबर्ट

8
@ tfb785: यह गलत है। जैसा कि माइकल बोर्गवर्ड द्वारा ऊपर कहा गया है: आदिम पूर्णांक प्रकार (लघु, इंट, लंबे) 0. से आरंभ किए गए हैं
Arne Deutsch

1
हाँ, java आदिम की सारणी जैसे int [] के साथ आरंभ किया जाता है 0. नहीं, एक जावा आदिम प्रकार 0. के साथ शुरू नहीं किया जाता है
Mirko Ebert

3
ठीक है, सटीक होने के लिए: आदिम वर्ग के सदस्यों (यह स्थिर हो या न हो) को 0. स्थानीय चर के साथ आरंभ किया जाता है।
Arne Deutsch

23

यह आपके आवेदन के प्रदर्शन को कैसे कम करता है ....? निम्नलिखित पढ़ें।

जावा लैंग्वेज स्पेसिफिकेशन में किसी भी ऑब्जेक्ट के लिए डिफॉल्ट / इनिशियल वैल्यू को फॉलो के रूप में दिया जा सकता है।

प्रकार के लिए बाइट , डिफ़ॉल्ट मान है शून्य , यह है कि, (बाइट) का मूल्य है 0

प्रकार के लिए कम , डिफ़ॉल्ट मान है शून्य , यह है कि, (छोटी) का मूल्य है 0

प्रकार के लिए पूर्णांक , डिफ़ॉल्ट मान है शून्य , कि है, 0

प्रकार के लिए लंबे समय तक , डिफ़ॉल्ट मान है शून्य , कि है, 0L

प्रकार के लिए नाव , डिफ़ॉल्ट मान है सकारात्मक शून्य , यह है कि, 0.0f

प्रकार के लिए डबल , डिफ़ॉल्ट मान है सकारात्मक शून्य , कि है, 0.0d

प्रकार के लिए चार , डिफ़ॉल्ट मान है अशक्त चरित्र, यह है कि, ' \ u0000 '।

प्रकार के लिए बुलियन , डिफ़ॉल्ट मान है झूठी

के लिए सभी संदर्भ प्रकार , डिफ़ॉल्ट मान है अशक्त

यह सब देखते हुए आपको सरणी तत्वों के लिए शून्य मानों के साथ आरंभ करने की आवश्यकता नहीं है क्योंकि डिफ़ॉल्ट रूप से सभी सरणी तत्व int सरणी के लिए 0 हैं।

क्योंकि एक सरणी एक कंटेनर ऑब्जेक्ट है जो एक एकल प्रकार के मूल्यों की एक निश्चित संख्या रखता है। अब आपके लिए सरणी का प्रकार int है इसलिए सभी सरणी तत्वों के लिए डिफ़ॉल्ट मान स्वचालित रूप से 0 होगा क्योंकि यह int प्रकार धारण कर रहा है ।

अब पर विचार सरणी के लिए स्ट्रिंग प्रकार , ताकि सभी सरणी तत्व है डिफ़ॉल्ट मान है अशक्त

ऐसा क्यों नहीं करते ......?

जैसा कि आप अपने प्रश्न में सुझाव देते हैं, आप लूप का उपयोग करके शून्य मान प्रदान कर सकते हैं।

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

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

मशीन चक्र का अधिक उपयोग ==> डेटा संसाधित करने का अधिक समय ==> आउटपुट समय में काफी वृद्धि होगी । ताकि आपके एप्लिकेशन डेटा प्रोसेसिंग को निम्न स्तर (कुछ स्तर तक धीमा) माना जा सके।


17

आप लूप को बचा सकते हैं, आरंभीकरण पहले से ही 0. एक स्थानीय चर के लिए बनाया गया है।

लेकिन कृपया उस जगह को सही करें जहां आप ब्रैकेट रखते हैं, पठनीयता के लिए (मान्यता प्राप्त सर्वोत्तम-अभ्यास):

int[] arr = new int[10];

14

अगर आप फ्लोट या इंटेगर का उपयोग कर रहे हैं तो आप इस तरह डिफ़ॉल्ट मान दे सकते हैं ...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));

6

आप अपने मौजूदा सरणी आकार के साथ एक नया खाली सरणी बना सकते हैं, और आप उन्हें वापस अपने सरणी में असाइन कर सकते हैं। यह अन्य की तुलना में तेज हो सकता है। Snipet:

package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
    // Your array with data
    int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //Creating same sized array with 0
    int[] tempArray = new int[yourArray.length];
    Assigning temp array to replace values by zero [0]
    yourArray = tempArray;

    //testing the array size and value to be zero
    for (int item : yourArray) {
        System.out.println(item);
    }
}
}

परिणाम :

0
0
0
0
0    
0
0
0
0

1

हां, किसी सरणी में इंट मान शून्य से आरंभिक हैं। लेकिन आपको इसकी गारंटी नहीं है। ओरेकल प्रलेखन में कहा गया है कि यह एक खराब कोडिंग अभ्यास है।


जावा लैंग्वेज स्पेसिफिकेशन के अनुसार, सेक्शन 15.10.2 , अगर एक एरे को क्रिएशन क्रिएशन अपवाद के साथ बनाया गया है जो शुरुआती मान प्रदान नहीं करता है, तो एरे के सभी एलीमेंट्स ऐरे के कंपोनेंट टाइप के लिए डिफॉल्ट वैल्यू से इनिशियलाइज़ हो जाते हैं - यानी 0 चार के मामले में []। यह एक गारंटी है; मैं ओरेकल के बारे में काफी आश्चर्यचकित रहूंगा क्योंकि यह एक बुरा अभ्यास है।
इयान रॉबर्टसन

1

प्रारंभिक मान प्रारंभिक होने के बाद पहले से ही शून्य हैं, जैसा कि सभी ने उल्लेख किया है। यदि आपके पास ऐसी स्थिति है जहां आपको वास्तव में सरणी मानों को शून्य पर सेट करने की आवश्यकता है और इसका उपयोग करना चाहते हैं System.arraycopy:

static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);

यह memcpyज्यादातर या सभी JRE कार्यान्वयन में कवर के तहत उपयोग करता है । ध्यान दें कि स्थैतिक का उपयोग कई थ्रेड्स के साथ भी सुरक्षित है, क्योंकि सबसे खराब स्थिति मल्टीपल थ्रेड्स हैzeros समवर्ती रूप से होती है, जो कुछ भी चोट नहीं पहुंचाती है।

आप Arrays.fillकुछ अन्य लोगों के रूप में भी इस्तेमाल कर सकते हैं । उपयोग Arrays.fill कर सकता हैmemcpyएक स्मार्ट JVM में , लेकिन शायद सिर्फ एक जावा लूप और चेकिंग की सीमा है जो प्रवेश करती है।

अपनी आशाओं को बेंचमार्क करें।


1

फिर भी java 8 के ऊपर लैम्ब्डा का उपयोग करके एक और दृष्टिकोण

 Arrays.stream(new Integer[nodelist.size()]).map(e -> 
 Integer.MAX_VALUE).toArray(Integer[]::new);

1

C / cpp में शून्य सबस्क्रिप्ट के साथ सभी ऐरे को इनिशियलाइज़ करने के लिए कोई शॉर्टकट नहीं है।

  int arr[10] = {0};

लेकिन जावा में एक जादुई उपकरण है जिसे Arrays.fill () कहा जाता है जो आपकी पसंद के पूर्णांक के साथ एक सरणी में सभी मानों को भर देगा।

  import java.util.Arrays;

    public class Main
    {
      public static void main(String[] args)
       {
         int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
         Arrays.fill(ar, 10);
         System.out.println("Array completely filled" +                          
            " with 10\n" + Arrays.toString(ar));
   }
 }

1

शून्य के मामले में प्रारंभिक की आवश्यकता नहीं है क्योंकि जावा में इंट का डिफ़ॉल्ट मूल्य शून्य है। शून्य से इतर मूल्यों के लिए java.util.Arraysकई विकल्प प्रदान करते हैं, सबसे सरल है एक तरीका।

int[] arr = new int[5];
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr));  //[-1, -1, -1, -1, -1 ]

int [] arr = new int[5];
// fill value 1 from index 0, inclusive, to index 3, exclusive
Arrays.fill(arr, 0, 3, -1 )
System.out.println(Arrays.toString(arr)); // [-1, -1, -1, 0, 0]

हम Arrays.setAll का उपयोग भी कर सकते हैं () यदि हम शर्त के आधार पर मूल्य भरना चाहते हैं:

int[] array = new int[20];
Arrays.setAll(array, p -> p > 10 ? -1 : p);

int[] arr = new int[5];
Arrays.setAll(arr, i -> i);
System.out.println(Arrays.toString(arr));   // [0, 1, 2, 3, 4]

0

सरणी को श्रेणी में चर के रूप में घोषित करें अर्थात हर विधि से और JVM इसे 0 को डिफ़ॉल्ट मान के रूप में देगा। आपको अब चिंता करने की आवश्यकता नहीं है


-3
    int a=7, b=7 ,c=0,d=0;
    int dizi[][]=new int[a][b];
    for(int i=0;i<a;i++){
        for(int q=d;q<b;q++){
            dizi[i][q]=c;               
            System.out.print(dizi[i][q]);
            c++;
        }

        c-=b+1;
        System.out.println();               
    }

परिणाम 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.