किसी सरणी से पहला तत्व निकालने का सबसे अच्छा तरीका क्या है?


86

मेरे पास स्ट्रिंग सरणी ( String[]) है और मुझे पहले आइटम को हटाने की आवश्यकता है। मैं इसे कुशलता से कैसे कर सकता हूं?



4
दुपट्टा नहीं। पिछला प्रश्न मूल्य द्वारा वस्तुओं को हटाने के बारे में है; यह सूचकांक द्वारा एक आइटम को हटाने के बारे में है।
james.garriss

जवाबों:


154

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

सरणी से किसी तत्व को हटाने का अनुकरण करने का एक तरीका यह है कि एक नया, छोटा सरणी बनाएं, और फिर मूल सरणी से नए, छोटे सरणी में सभी तत्वों की प्रतिलिपि बनाएँ।

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

हालाँकि , मैं उपरोक्त विधि का सुझाव नहीं दूंगा। आपको वास्तव में ए का उपयोग करना चाहिए List<String>। सूचियाँ आपको किसी भी सूचकांक से आइटम जोड़ने और हटाने की अनुमति देती हैं। यह निम्नलिखित के समान होगा:

List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item

32
यह ध्यान रखना महत्वपूर्ण है कि ArrayListओ (एन) के पहले तत्व को हटाना ।
मैथ्यू फ्लैशेन

1
@ मैट, एक सरणी और सूची के लिए। लेकिन, सूची के लिए कोड आसान है।
jjnguy

16
एक सरणी और ए के लिए ArrayList, लेकिन इसके लिए नहीं LinkedList
मैथ्यू फ्लेशेन

4
पर) ? अच्छा .. एक सी सरणी में? मुट्ठी तत्व को हटाने के लिए आप सूचक O (1) को
बढ़ा सकते हैं

2
उन लोगों के लिए जो मेरे जैसे एंड्रॉइड के लिए जावा का उपयोग कर रहे हैं, Arrays.copyOfRange()API9 + के लिए है
Sdghasemi

14

सबसे सरल तरीका संभवतः इस प्रकार है - आपको मूल रूप से एक नया सरणी बनाने की आवश्यकता है जो एक तत्व छोटा है, फिर उन तत्वों की प्रतिलिपि बनाएँ जिन्हें आप सही स्थिति में रखना चाहते हैं।

int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);

ध्यान दें कि यदि आप अपने आप को इस तरह के ऑपरेशन को अक्सर करते हुए पाते हैं, तो यह एक संकेत हो सकता है कि आपको वास्तव में एक अलग प्रकार की डेटा संरचना का उपयोग करना चाहिए, जैसे कि एक लिंक की गई सूची। हर बार एक नए सरणी का निर्माण एक O (n) ऑपरेशन है, जो आपके सरणी के बड़े होने पर महंगा हो सकता है। एक लिंक की गई सूची आपको पहला तत्व निकालने के लिए O (1) देगी।

एक वैकल्पिक विचार पहले आइटम को बिल्कुल भी नहीं हटाना है, लेकिन सिर्फ एक पूर्णांक बढ़ाता है जो उपयोग में आने वाले पहले सूचकांक को इंगित करता है। सरणी के उपयोगकर्ताओं को इस ऑफसेट को ध्यान में रखना होगा, लेकिन यह एक कुशल दृष्टिकोण हो सकता है। Java स्ट्रिंग क्लास वास्तव में सबस्ट्रिंग बनाते समय इस पद्धति का आंतरिक रूप से उपयोग करता है।


4
यह तकनीकी रूप से सबसे आसान तरीका नहीं है। Arrays.copyOfRange()है।
jjnguy

4
के बाद से वह Java6 उपयोग कर रहा है, वह अधिक कॉम्पैक्ट Arrays.copyOfRange उपयोग कर सकते हैं
थिलो

1
@ जस्टिन - यकीन है, लेकिन केवल अगर आप जावा 1.6 या इसके बाद के संस्करण को लक्षित कर रहे हैं
मीका

1
सच। यह हमेशा लागू नहीं होता है।
jjnguy

6
सवाल का शीर्षक यह स्पष्ट है कि ओपी बनाता है जावा 1.6 के लिए और ऊपर जवाब में रुचि।
स्टीफन सी

5

आप इसे बिल्कुल नहीं कर सकते हैं, जल्दी से अकेले चलो। जावा में ऐरे निश्चित आकार हैं। आप कर सकते हैं दो चीजें हैं:

  1. हर तत्व को एक में बदलें, फिर अंतिम तत्व को शून्य करने के लिए सेट करें।
  2. एक नया सरणी बनाएं, फिर उसे कॉपी करें।

आप System.arraycopyइनमें से किसी एक के लिए उपयोग कर सकते हैं । ये दोनों O (n) हैं, क्योंकि वे सभी तत्व को कॉपी करते हैं।

यदि आप अक्सर पहला तत्व निकाल रहे हैं, तो LinkedListइसके बजाय उपयोग करने पर विचार करें । आप सुविधा के लिए LinkedList.remove, जो Queueइंटरफ़ेस से है, का उपयोग कर सकते हैं । LinkedListपहला तत्व निकालने के साथ , ओ (1) है। वास्तव में, किसी भी तत्व को हटाने के बाद ओ (1) एक बार जब आप ListIteratorउस स्थिति में आ जाते हैं। हालांकि, सूचकांक द्वारा एक मनमाना तत्व तक पहुंच O (n) है।


2

सरणी के पहले "लाइव" तत्व का एक सूचकांक रखें। पहले तत्व को हटाना (हटाने का ढोंग करना) फिर O(1)समय जटिलता ऑपरेशन बन जाता है ।


0

संक्षेप में, त्वरित लिंक विधि:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);

-8

एक वैकल्पिक बदसूरत विधि:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");

2
कृपया, किसी ने पर्याप्त प्रतिष्ठा के साथ इस उत्तर को अस्वीकार कर दिया - यह वास्तव में यही कहता है कि यह है - बदसूरत! अशिष्ट होने का कोई इरादा नहीं है, लेकिन कोडबिलिटी के हितों में कृपया इस तरह की बात न करें!
हैक 5

यदि आप पहले से ही Arrays का उपयोग कर रहे हैं, तो Arrays.copyOfRange का उपयोग करना बेहतर होगा
गौतम

उसने सबसे अच्छा तरीका पूछा ।
Sapphire_Brick

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