चर लंबाई (गतिशील) जावा में सारणी


108

मैं सोच रहा था कि एक पूर्णांक सरणी को कैसे शुरू किया जाए जैसे कि यह आकार और मूल्य मेरे कार्यक्रम के निष्पादन के माध्यम से बदलते हैं, कोई सुझाव?

जवाबों:


121

हाँ: ArrayList का उपयोग करें ।

जावा में, "सामान्य" सरणियाँ निश्चित-आकार हैं। आपको उन्हें एक आकार देना होगा और उन्हें विस्तारित या अनुबंधित नहीं कर सकते। आकार बदलने के लिए, आपको एक नई सारणी बनानी होगी और मनचाहा डेटा कॉपी करना होगा - जो कि आपके लिए अक्षम और एक दर्द है।

सौभाग्य से, सभी प्रकार के अंतर्निहित वर्ग हैं जो सामान्य डेटा संरचनाओं को लागू करते हैं, और अन्य उपयोगी उपकरण भी। आप उनकी पूरी सूची के लिए जावा 6 एपीआई की जांच करना चाहेंगे ।

एक चेतावनी: ArrayList केवल ऑब्जेक्ट्स (जैसे इंटेगर) को पकड़ सकता है, न कि प्रिमिटिव (उदाहरण के लिए)। MOST मामलों में, ऑटोबॉक्सिंग / ऑटोऑनबॉक्सिंग आपके लिए चुपचाप इसका ख्याल रखेगा , लेकिन आप जो कर रहे हैं उसके आधार पर आपको कुछ अजीब व्यवहार मिल सकता है।


2
मुझे आश्चर्य है कि जावा में निम्नलिखित कोड सही क्यों है? int[] array = new int[size]; sizeएक चर रहा है, लेकिन एक सरणी की लंबाई तय की जानी चाहिए, मैं सही @Lord Torgamus हूँ?
jerry_sjtu

12
@jerry_sjtu हाँ, सरणी आकार से मेल खाने के लिए नहीं बदलती है sizeक्योंकि कार्यक्रम चलता है; sizeजब उस लाइन को निष्पादित किया जाता है, तो उसे जो भी आकार प्राप्त होता है।
पोप्स

जब भी मैं किसी ArrayList से कोई आइटम निकालता हूं, तो मैं अंत में समाप्त हो जाता हूं null। कोई विचार क्यों?
एरॉन फ्रेंक

37

जावा में एरर्स निश्चित आकार के होते हैं। आपको एक ArrayList की आवश्यकता है, जो जावा में उपलब्ध बहुत से मूल्यवान संग्रहों में से एक है।

के बजाय

Integer[] ints = new Integer[x]

तुम इस्तेमाल

List<Integer> ints = new ArrayList<Integer>();

फिर आपके द्वारा उपयोग की जाने वाली सूची को बदलने के लिए ints.add(y)और ints.remove(z)कई अन्य उपयोगी तरीकों के बीच आप उपयुक्त Javadocs में पा सकते हैं।

मैं दृढ़ता से जावा में उपलब्ध संग्रह वर्गों का अध्ययन करने की सलाह देता हूं क्योंकि वे बहुत शक्तिशाली हैं और आपको बहुत अधिक अंतर्निहित कार्यक्षमता प्रदान करते हैं जो कि जावा-न्यूबॉकों में अनावश्यक रूप से खुद को फिर से लिखने की कोशिश करते हैं।


जब तक मैंने कोशिश की तब तक काम करना चाहता हूं: सूची <Integer> ints = new ArrayList <Integer> ();
गोरबीस्म

5
List<Integer>इसके बजाय आप का उपयोग क्यों करते हैं ArrayList<Integer>?
डीन मेहान

24

एक बार तात्कालिक रूप से एरे को निश्चित आकार दिया जाता है। आप इसके बजाय एक सूची का उपयोग कर सकते हैं।

Autoboxing एक सरणी के समान प्रयोग करने योग्य सूची बनाते हैं, आप इसमें केवल अंतर-मान डाल सकते हैं:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
आप प्रकार सूची का संदर्भ चर क्यों घोषित करते हैं, न कि ArrayList?
LppEdd

2
क्योंकि यह आपको केवल यदि आवश्यक हो तो सूची-कार्यान्वयन के बीच स्विच करने की अनुमति देता है, आपको केवल नया XYZList () बदलना होगा। यदि चर को ऐरेलेस्ट के रूप में घोषित किया जाता है, तो ओयो इस कार्यान्वयन के लिए विशिष्ट तरीकों का उपयोग कर सकता है, जिससे बदलाव अधिक जटिल हो सकता है।
मुनीम

1
धन्यवाद, मैं समझता हूं।
LppEdd

11

मैं सुझाव देने वाले पिछले उत्तरों से असहमत हूं ArrayList, क्योंकि एक डायनामिक एरे नहींArrayList है , लेकिन एक सरणी द्वारा समर्थित सूची है। अंतर यह है कि आप निम्न कार्य नहीं कर सकते हैं:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

यह आपको एक IndexOutOfBoundsException देगा क्योंकि इस स्थिति में कोई तत्व नहीं है फिर भी बैकिंग सरणी इस तरह के अतिरिक्त की अनुमति देगा। तो आपको @ रैंडी-लांस द्वारा सुझाए गए कस्टम विस्तार योग्य एरे कार्यान्वयन का उपयोग करने की आवश्यकता है


मेरा मानना ​​है कि आप इसे codereply.com/answer/6i5bur/java-dynamic-arrays.html
अमित कुमार गुप्ता

मुझे यकीन नहीं है कि अगर ArrayList में कोई पुट विधि है जैसा कि मैं Java8 स्रोत कोड में देखता हूं। बस यह पता लगाने की कोशिश की जा रही है कि यह दी गई क्षमता के साथ कैसा व्यवहार करता है। हालाँकि ArrayList.add () विधि मिली।
संजीत एक

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

स्रोत: कैसे गतिशील सरणी बनाने के लिए


7
  1. छोटे पैमाने के आकार से निपटने के लिए सूची का उपयोग करने की सिफारिश की जाती है।

  2. आप संख्या की एक बड़ी संख्या है, तो कभी सूची और autoboxing उपयोग करते हैं,

    सूची <पूर्णांक> सूची

हर एक इंट के लिए एक नया इंटेगर ऑटो बनाया गया है। सूची का आकार बढ़ने पर आपको यह धीमा हो जाएगा। ये इंटेगर अनावश्यक वस्तुएं हैं। इस मामले में, अनुमानित आकार का उपयोग करना बेहतर होगा,

int[] array = new int[ESTIMATED_SIZE];


4

आप किसी सरणी का आकार नहीं बदल सकते। हालाँकि, आप सही आकार के साथ एक नया सरणी बना सकते हैं और पुराने सरणी से नए में डेटा कॉपी कर सकते हैं।

लेकिन आपका सबसे अच्छा विकल्प जकार्ता कॉमन्स से IntList का उपयोग करना है। ( यहाँ )

यह एक सूची की तरह ही काम करता है, लेकिन कम जगह लेता है और इससे अधिक कुशल है, क्योंकि यह इंट के बजाय रैपर वस्तुओं को संग्रहीत करने के बजाय इंट का स्टोर करता है (यह वही है जो इंटेगर वर्ग है)।


-4

मैंने इस सवाल का जवाब दिया और नहीं, आपको किसी एंकलिस्ट या किसी अन्य चीज़ की ज़रूरत नहीं है, यह एक असाइनमेंट था और मैंने इसे पूरा किया इसलिए हाँ सरणियाँ आकार में बढ़ सकती हैं। यहाँ लिंक है कि जावा डायनेमिक एरे का उपयोग कैसे करें और यहाँ मेरे प्रश्न का लिंक है, जिसका मैंने जावा डायनेमिक सरणियों में उत्तर दिया है


1
यह सिर्फ गलत है। लिंक किए गए उत्तर कॉल System.arrayCopy (), पुराने सरणी को नए आकार में बढ़ाते हुए, फिर नई प्रविष्टि जोड़ते हुए। सरणियों में अभी भी एक गतिशील आकार नहीं हो सकता है।
katzenhut
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.