मैं एक ArrayList को जावा में एक ArrayList से कैसे निकाल सकता हूँ?


80

मैं ArrayListजावा में ऐरे स्लाइस कैसे प्राप्त करूं ? विशेष रूप से मैं ऐसा कुछ करना चाहता हूं:

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

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


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

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

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

जवाबों:


124

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

आपकी समस्या यह है कि आप उपयोग कर रहे हैं 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))

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


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

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

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


6
वास्तव में, सब्लिस्ट एक प्रतिलिपि नहीं बनाता है; यह मूल सूची में एक दृश्य देता है ( docs.oracle.com/javase/6/docs/api/java/util/… )
मैट

3
वास्तव में @ मैथ्यू, मैं ओपी के आत्म-उत्तर का उल्लेख कर रहा हूं जहां वह ऐसा करता है:new ArrayList(input.subList(0, input.size()/2))
स्टीफन सी

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

6

मैं एक रास्ता मिल गया है अगर आप startIndex और endIndex तत्वों को जानते हैं तो एक को ArrayList से निकालने की आवश्यकता है

आज्ञा देना alमूल ArrayList और startIndex, endIndexशुरू हो और अंत सूचकांक क्रमशः सरणी से हटा दिया जाए:

al.subList(startIndex, endIndex + 1).clear();

6

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

संपादित करें : वास्तव में, मुझे लगता है कि आप उस सूची को ले जा सकते हैं और इसका उपयोग एक ArrayList के एक ArrayList का उपयोग कर एक नया ArrayList को तत्काल करने के लिए कर सकते हैं ।


2
ठीक यही मैंने किया (इससे पहले कि मैं आपका संपादन पढ़ूं) अपना जवाब पोस्ट किया। धन्यवाद:)
बीटी

लेकिन वह एक नया ArrayList बनाने के लिए सूची की प्रतिलिपि बनाता है।
जोरेन

2
@ बीटी - रिकॉर्ड के लिए, इस संदर्भ में सामान्य रूप से शब्द "स्लाइस" नहीं है।
स्टीफन सी

2

हालांकि यह पद बहुत पुराना है। मामले में अगर कोई इसकी तलाश कर रहा है ..

अमरूद एक निर्दिष्ट आकार के उप-सूची में सूची को विभाजित करने की सुविधा प्रदान करता है

List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
    List<List<Integer>> subSets = Lists.partition(intList, 3);

अमरूद सूचियों के त्वरित लिंक प्रलेखन: google.github.io/guava/releases/19.0/api/docs/com/google/common/…
आर्यनज-एनवाईसी

-4

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

ArrayList<Integer> inputA = new ArrayList<Integer>(input.subList(0, input.size()/2));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.