2009-09-26 15 views
49

मैं जावा में ArrayList का सरणी टुकड़ा कैसे प्राप्त करूं? विशेष रूप से मैं इस तरह कुछ करना चाहता हूँ:मैं जावा में एक ऐरेलिस्ट से बाहर ArrayList कैसे टुकड़ा कर सकता हूं?

ArrayList<Integer> inputA = input.subList(0, input.size()/2); 
// where 'input' is a prepouplated ArrayList<Integer> 

तो मैं यह काम करने की उम्मीद है, लेकिन जावा एक List रिटर्न - तो यह असंगत है। और जब मैं इसे डालने की कोशिश करता हूं, तो जावा मुझे नहीं जाने देगा। मुझे ArrayList की आवश्यकता है - मैं क्या कर सकता हूं?

+4

आप 'ऐरेलिस्ट' का उपयोग करने का आग्रह क्यों करते हैं? मुझे लगता है कि आप समझने में थोड़ा सा कमी महसूस कर सकते हैं कि इंटरफेस कैसे काम करते हैं क्योंकि 'सूची' और' ऐरेलिस्ट 'असंगत नहीं हैं-' एर्रेलिस्ट '' सूची 'लागू करता है, और' सूची' में शायद आपको आवश्यक सभी आवश्यक विधियां शामिल हैं। – Bombe

+2

मैं ArrayList का उपयोग करने पर जोर देता हूं क्योंकि यह एक कठोर विधि प्रोटोटाइप के साथ एक अभिप्राय प्रश्न है। मुझे स्पष्ट रूप से समझ की कमी है, क्योंकि उपसूची को एक सूची प्रकार वापस करना है, और फिर भी मैं लौटाई गई सूची को ArrayList में नहीं डाल सकता। तो आप मुझे आदमी बताओ .. –

+4

यह पूरी तरह से संभव है कि उसे 'ऐरेलिस्ट' की आवश्यकता है क्योंकि उसके बाद उसे एक विधि को कॉल करने की आवश्यकता है जो 'ऐरेलिस्ट' स्वीकार करता है। तर्कसंगत रूप से ऐसी विधि खराब रूप से डिज़ाइन की गई है और इसके बजाय 'सूची' स्वीकार करनी चाहिए, लेकिन ऐसी स्थितियां न केवल साक्षात्कार के प्रश्नों में उत्पन्न हो सकती हैं बल्कि दूसरों द्वारा लिखे गए कोड में भी हो सकती हैं कि कोई भी नहीं जा सकता और बदल सकता है। सहकर्मियों और पुस्तकालय हमेशा सही नहीं होते हैं। – Gravity

उत्तर

86

जावा में, एपीआई में कंक्रीट कक्षाओं के बजाय इंटरफ़ेस प्रकारों का उपयोग करना अच्छा अभ्यास है।

आपकी समस्या यह है कि आप ArrayList (शायद कई स्थानों पर) का उपयोग कर रहे हैं जहां आपको वास्तव में List का उपयोग करना चाहिए। नतीजतन आपने अपने लिए एक अनावश्यक बाधा के साथ समस्याएं पैदा कीं कि सूची ArrayList है।

List input = new ArrayList(...); 

public void doSomething(List input) { 
    List inputA = input.subList(0, input.size()/2); 
    ... 
} 

this.doSomething(input); 

आपका प्रस्तावित समस्या के लिए "समाधान" था/यह है::

यह वही अपने कोड की तरह दिखना चाहिए है

new ArrayList(input.subList(0, input.size()/2)) 

कि की एक प्रतिलिपि बनाकर काम करता है उपन्यासकार यह सामान्य अर्थ में एक टुकड़ा नहीं है। इसके अलावा, अगर उपन्यास बड़ा है, तो प्रतिलिपि बनाना महंगा होगा।


आप API शामिल हैं नहीं बदल सकते हैं, तो आप करने के लिए है ऐसी है कि एक ArrayList रूप inputA घोषित, आप ArrayList के एक कस्टम उपवर्ग को लागू करने में सक्षम हो सकता से विवश कर रहे हैं, जिसमें subList विधि रिटर्न ArrayList का उप-वर्ग। हालांकि:

  1. यह डिजाइन, कार्यान्वयन और परीक्षण के लिए बहुत काम करेगा।
  2. आपने अब ArrayList कक्षा के पहलुओं पर अनियंत्रित पहलुओं (और इसलिए "परिवर्तन के अधीन") पर निर्भरताओं के साथ अपने कोड आधार पर महत्वपूर्ण नई कक्षा को जोड़ा है।
  3. आपको अपने कोडबेस में प्रासंगिक स्थानों को बदलने की आवश्यकता होगी जहां आप अपने उप-वर्ग के उदाहरण बनाने के लिए ArrayList उदाहरण बना रहे हैं।

"सरणी की प्रतिलिपि" समाधान अधिक व्यावहारिक है ... यह ध्यान में रखते हुए कि ये सही स्लाइस नहीं हैं।

+3

वास्तव में, उपसूची एक प्रतिलिपि नहीं बनाता है; यह मूल सूची में एक दृश्य देता है (http://docs.oracle.com/javase/6/docs/api/java/util/List.html#subList%28int,%20int%29) – Matthew

+2

असल में @ मैथ्यू, मैं मैं ओपी के आत्म-जवाब का जिक्र कर रहा हूं जहां वह ऐसा करता है: 'नया ऐरेलिस्ट (input.subList (0, input.size()/2)) ' –

6

यदि कोई मौजूदा विधि नहीं है तो मुझे लगता है कि आप 0 से input.size()/2 से फिर से सक्रिय कर सकते हैं, प्रत्येक तत्व को लेते हुए और इसे एक नए ऐरेलिस्ट में जोड़ सकते हैं।

EDIT: असल में, मुझे लगता है कि आप उस सूची को ले सकते हैं और one of the ArrayList constructors का उपयोग करके एक नए ऐरेलिस्ट को तुरंत चालू करने के लिए इसका उपयोग कर सकते हैं।

+2

ठीक वही करता है जो मैंने किया था (मैंने आपके संपादन को पढ़ने से पहले अपना उत्तर पोस्ट किया)। धन्यवाद:) –

+0

लेकिन वह * प्रतियां * एक नई ArrayList बनाने के लिए सूची। – Joren

+2

@ बीटी - रिकॉर्ड के लिए, यह नहीं है कि "स्लाइस" शब्द का अर्थ आमतौर पर इस संदर्भ में है। –

-4

इस तरह मैंने इसे हल किया। मैं भूल गया कि सब्लिस्ट मूल सूची में तत्वों का सीधा संदर्भ था, इसलिए यह समझ में आता है कि यह क्यों काम नहीं करेगा।

ArrayList inputA = new ArrayList (input.subList (0, input.size()/2));

2

मैं अगर तुम STARTINDEX और तत्वों की ENDINDEX पता एक al मूल ArrayList और startIndex होने दो, endIndex शुरू किया और अंत सूचकांक ArrayList

से हटाने की जरूरत क्रमशः सरणी से निकाले जाने का एक रास्ता मिल गया है :

al.subList(startIndex, endIndex + 1).clear(); 
संबंधित मुद्दे