2010-12-26 5 views
19

मेरे पास एक ऐसी स्थिति है जहां मुझे इनपुट सरणी पर मानदंड लागू करना है और आउटपुट के रूप में एक और सरणी को दोबारा बनाना है जिसमें फ़िल्टरिंग मानदंडों के आधार पर छोटे आकार होंगे।मैं इसे आकार के बिना सरणी कैसे शुरू कर सकता हूं?

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

एक तरीका है कि मूल इनपुट सरणी को पहले लूप करें और काउंटर सेट करें, और उसके बाद उस काउंटर की लंबाई के साथ एक और लूप बनाएं और प्रारंभ करें और इस सरणी को भरें []। लेकिन क्या सिर्फ एक लूप में नौकरी करने के लिए वैसे भी है?

+3

आप ऐरेलिस्ट का उपयोग क्यों नहीं करते? –

उत्तर

32

आप नहीं कर सकते ... जावा में एक सरणी का आकार हमेशा तय किया जाता है। आम तौर पर एक सरणी का उपयोग करने के बजाय, आप List<T> के कार्यान्वयन का उपयोग करेंगे - आमतौर पर ArrayList<T>, लेकिन कई अन्य विकल्पों के साथ उपलब्ध हैं।

आप अंतिम चरण के रूप में सूची से एक सरणी बना सकते हैं - या बस List<T> को शुरू करने के लिए विधि के हस्ताक्षर को बदल सकते हैं।

+0

आप इस स्थिति में 'एरेलेलिस्ट' को 'लिंक्डलिस्ट' क्यों पसंद करेंगे? – Roman

+0

@ रोमन: मैं स्वाभाविक रूप से स्वाभाविक रूप से एक ऐरेलिस्ट के लिए पहुंचता हूं। लिंक्डलिस्ट भी ठीक होगा ... निश्चित रूप से स्मृति के मामले में यह अधिक महंगा है, लेकिन इसे विस्तार पर तत्वों की प्रतिलिपि बनाने की आवश्यकता नहीं है। –

+0

@Roman: चर्चा के लिए [जब ArrayList पर LinkedList का उपयोग करें] देखें (http://stackoverflow.com/q/322715/18192)। कहा जा रहा है कि, आपका पहला झुकाव 'ArrayList' होना चाहिए। – Brian

3

इसके बजाय LinkedList का उपयोग करें। इससे भी कम, यदि आवश्यक हो तो आप एक सरणी बना सकते हैं।

+1

'ऐरेलिस्ट' शायद अधिक उचित –

+1

@ नोएल एम: क्यों? मुझे लगता है कि यह नहीं होगा। हम तत्वों की संख्या नहीं जानते हैं। इसलिए, लिंक्डलिस्ट के साथ प्रत्येक ऐड (यानी ऐडलास्ट) ऑपरेशन ओ (1) में काम करता है और वास्तव में थोड़ा काम करता है, जबकि 'ऐरेलिस्ट' कई बार अपने आकार को स्वत: जोड़ देगा और ये महंगी परिचालन होंगे। – Roman

+1

दूसरी ओर, एक लिंक्डलिस्ट के साथ आप प्रत्येक तत्व के लिए एक नोड ऑब्जेक्ट बना रहे हैं। आप दावा करते हैं कि विस्तार एक "महंगा" ऑपरेशन है - यह केवल एक नई सरणी बनाने और मौजूदा तत्वों की प्रतिलिपि बनाने की बात है (जो एक तेज सरणी प्रतिलिपि हो सकती है)। मुझे नहीं लगता कि यह कहना आसान है कि इस स्थिति के लिए समान रूप से "बेहतर" है। –

3

उपयोग ArrayList. सरणी आकार जावा में तय हो गई है

3

बस सूची के किसी भी प्रकार लौट आते हैं। ArrayList ठीक हो जाएगा, यह स्थिर नहीं है।

ArrayList<yourClass> list = new ArrayList<yourClass>(); 
for (yourClass item : yourArray) 
{ 
    list.add(item); 
} 
0

यहां आपके लिए कक्षा है। लेकिन इसमें बहुत से रिफैक्टरिंग भी शामिल हैं। कृपया इसके बजाय प्रत्येक के लिए एक जोड़ें। चीयर्स :)

static int isLeft(ArrayList<String> left, ArrayList<String> right) 

    { 
     int f = 0; 
     for (int i = 0; i < left.size(); i++) { 
      for (int j = 0; j < right.size(); j++) 

      { 
       if (left.get(i).charAt(0) == right.get(j).charAt(0)) { 
        System.out.println("Grammar is left recursive"); 
        f = 1; 
       } 

      } 
     } 
     return f; 

    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
     ArrayList<String> left = new ArrayList<String>(); 
     ArrayList<String> right = new ArrayList<String>(); 


     Scanner sc = new Scanner(System.in); 
     System.out.println("enter no of prod"); 
     int n = sc.nextInt(); 
     for (int i = 0; i < n; i++) { 
      System.out.println("enter left prod"); 
      String leftText = sc.next(); 
      left.add(leftText); 
      System.out.println("enter right prod"); 
      String rightText = sc.next(); 
      right.add(rightText); 
     } 

     System.out.println("the productions are"); 
     for (int i = 0; i < n; i++) { 
      System.out.println(left.get(i) + "->" + right.get(i)); 
     } 
     int flag; 
     flag = isLeft(left, right); 
     if (flag == 1) { 
      System.out.println("Removing left recursion"); 
     } else { 
      System.out.println("No left recursion"); 
     } 

    } 
2

यदि आप ऐसा करते हैं, तो आप वास्तव में किसी भी संग्रह का उपयोग नहीं कर सकते हैं, केवल एक सरणी घोषित कर सकते हैं।

ClassName[] arrayname; 
    ... 
arrayname = new ClassName[10*15*100*variable+CONSTANT+Math.ciel(Math.Random())]; 
संबंधित मुद्दे