ArrayList से आइटम निकालें


100

मेरे पास एक ArrayListअनुमान है list, और इसमें 8 आइटम एएच हैं और अब मैं 1,3,5 स्थिति को हटाना चाहता हूं कि इंट सरणी में संग्रहीत आइटम listमैं यह कैसे कर सकता हूं।

मैं इसके साथ करने की कोशिश कर रहा हूं

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

लेकिन पहले आइटम हटाए जाने के बाद सरणी को बदल दिया जाता है और अगले पुनरावृति में यह गलत तत्व को हटा देता है या अपवाद देता है।


सूचकांकों के अवरोही क्रम में इसे हटाने के बारे में कैसे करें (सूचकांकों को क्रमबद्ध करें, फिर पहले उच्चतम सूचकांक के साथ तत्व को हटा दें)?
nhahtdh

1
आपका तर्क त्रुटिपूर्ण है। निश्चित रूप से आपको प्रत्येक वस्तु की स्थिति के बारे में नहीं सोचना चाहिए, बल्कि स्वयं वस्तुओं के बारे में सोचना चाहिए। दूसरे शब्दों में, आप पदों 1, 3 और 5 को दूर नहीं करना चाहते हैं, लेकिन इसके बजाय आप आइटम हटाने के लिए (चाहे वे कहीं भी कर रहे हैं चाहते हैं List) का उपयोग कर equals("B"), equals("D")और equals("F")। इसके बारे में सोचो।
स्क्वांक

हां मैं आइटम को हटाना चाहता हूं लेकिन मैं आइटम से कैसे मिलान कर सकता हूं। वास्तव में वास्तव में यह आइटम लिस्ट
व्यू में हैं

धीमा विकल्प: एक बार तत्वों को दूसरी सूची में जोड़ने के लिए, पहले से हटाने वाली दूसरी सूची को पुनरावृत्त करें (वैकल्पिक चरण: कॉलर को दूसरी सूची
लौटाएं

जवाबों:


134

इस विशिष्ट मामले में , आपको तत्वों को अवरोही क्रम में निकालना चाहिए। पहला सूचकांक5 , फिर 3, फिर 1। यह अवांछनीय दुष्प्रभावों के बिना सूची से तत्वों को हटा देगा।

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}

1
ओपी के ArrayList में Strings है, न कि Integers (फिर भी, मैं आपके अवलोकन से सहमत हूं)।
एलेक्स लॉकवुड

@ एलेक्स: यह जवाब काम करेगा लेकिन यह उतना ही त्रुटिपूर्ण है जितना कि उनके सवाल में ओपी का तर्क। हम इस बारे में बात कर रहे हैं ArrayList<E>- कोई भी किसी वस्तु को ArrayListशुद्ध रूप से स्थिति से हटाने के बजाय परीक्षण के बजाय उस स्थिति में क्या करना चाहता है? ओपी अच्छी तरह Stringसे ऑब्जेक्ट प्रकार के रूप में उपयोग कर सकता है , ArrayListलेकिन आपका जवाब जेनरिक के लिए वास्तव में खराब कोडिंग अभ्यास है, भले ही यह ओपी की विशेष स्थिति को हल करता हो।
स्क्वांक

3
हाँ, मैं आपसे सहमत हूँ। लेकिन ओपी ने पूछा ArrayList<String>, नहीं ArrayList<E>
एड्रियन मॉन्क

मैं इस जवाब से पूरी तरह असहमत हूं, @MisterSquonk फिर आश्वस्त, समाधान सामान्य होना चाहिए। इसके अलावा मैं नीचे क्यों हो रहा हूँ?
मोहम्मद अजहरुद्दीन शेख

66
ठीक है, सुनो ... मुझे नहीं पता कि क्या बड़ी बात है। ओपी ने अपने कोड को पोस्ट किया और मैंने एक जवाब के साथ जवाब दिया जो एक संभावित फिक्स को चित्रित करता है। मुझे खेद है कि मैं पूरी तरह से सामान्य समाधान देकर ऊपर और परे नहीं गया ... लेकिन जहां तक ​​मैं बता सकता हूं, ओपी एक प्रोग्रामिंग सबक के लिए नहीं पूछ रहा था। वह पूछ रहा था "यह कोड काम क्यों नहीं कर रहा है?" मुझे अपना जवाब देने के लिए मुझे दोष मत देना शुरू करें क्योंकि आपने प्रश्न की अलग तरह से व्याख्या की है।
एलेक्स लॉकवुड

30

आप तत्वों को ArrayListउपयोग करने से हटा सकते हैं ListIterator,

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position

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

10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}

7

जैसा पहले बताया गया है

iterator.remove()

शायद लूप के दौरान सूची आइटम निकालने का एकमात्र सुरक्षित तरीका है।

पुनरावृत्त का उपयोग करके हटाने वाली वस्तुओं की गहरी समझ के लिए, इस धागे को देखने का प्रयास करें


मैं कोई वोट नहीं डाल रहा हूं, मैं आपसे पूरी तरह सहमत हूं। ऐसा करने का यह सबसे सुरक्षित तरीका है।
सिम्मंत

3

मुझे लगता है कि जिस सरणी पर मुझे चढ़ना है, वह इटरेटर के साथ एक और समाधान है, यह अधिक सामान्य है:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}

2

इस बारे में कैसा है? बस इसे एक विचार दें-

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

और आउटपुट था-

[A, C, E, G, H]

2

इसे इस तरह आजमाएं,

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}


2

यदि आप "=" का उपयोग करते हैं, तो दूसरे में मूल सरणी सूची के लिए एक प्रतिकृति बनाई जाती है, लेकिन संदर्भ समान है यदि आप एक सूची में बदलते हैं, तो दूसरा भी संशोधित हो जाएगा। इसके बजाय "=" का उपयोग करें

        List_Of_Array1.addAll(List_Of_Array);

2

सरणी सूची को हटाने (इंट इंडेक्स) की विधि सूची में निर्दिष्ट स्थान (इंडेक्स) पर तत्व को हटा देती है। सरणी सूची आइटम को हटाने के बाद किसी भी बाद के तत्वों को बाईं ओर शिफ्ट किया जाता है।

यदि एक सरणी सूची में 20,15,30,40} का अर्थ है

मैंने विधि को बुलाया है: arraylist.remove (1)

फिर डेटा 15 को हटा दिया जाएगा और 30 और 40 इन दो वस्तुओं को 1 से स्थानांतरित कर दिया जाएगा।

इस कारण से आपको पहले सरणी सूची के उच्च सूचकांक आइटम को हटाना होगा।

तो..आपकी दी हुई स्थिति के लिए.. कोड होगा ..

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.