2013-10-19 13 views
8

मैं code-क्यों ArrayList.remove काम नहीं कर रहा

import java.util.ArrayList; 

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

     ArrayList<String> name = new ArrayList<String>(); 

     name.add("Chris"); 
     name.add("Lois"); 
     name.add("Meg"); 
     name.add("Meg"); 
     name.add("Brain"); 
     name.add("Peter"); 
     name.add("Stewie"); 

     System.out.println(name); 

     for (int i = 0; i < name.size(); i++){ 
      String oldName = name.get(i); 
      if(oldName.equals("Meg")) 
      { 
       name.remove(i); 
      } 
     } 

     System.out.println(name); 
    } 
} 

निम्नलिखित है लेकिन यहाँ यह मेरे उत्पादन देता है -

[Chris, Lois, Meg, Meg, Brain, Peter, Stewie] 
[Chris, Lois, Meg, Brain, Peter, Stewie] 

मैं बिंदु नहीं मिल रहा है, क्यों इस Meg को हटाने नहीं है, लेकिन मैंने उस मामले में केवल एक Meg के साथ प्रयास किया है, यह काम कर रहा है। और जब मैं कुछ Meg जोड़ रहा हूं, तो पिछले Meg को ArrayList से हटाया नहीं गया है। क्यूं कर?

+0

आप एक पाश के बीच में दूर करने के लिए एक iterator उपयोग करना चाहिए। यह अक्सर कवर किया जाता है। http://stackoverflow.com/questions/13847695/java-delete-arraylist-iterator – zero298

+2

मैंने इस शाम को कम से कम 2 बार इस स्निपेट को देखा है। यदि आप पिछले कुछ घंटों के जावा सबमिशन को देखते हैं तो आपको बहुत सारी सहायक टिप्पणियां मिलेंगी जो आपके सटीक मामले की सहायता करेंगी। –

+0

"मस्तिष्क"। ._______। – Boann

उत्तर

22

आप पहली बार "मेग", सूचकांक i=2 निकाल देते हैं। फिर यह बढ़ता जा रहा है, लेकिन चूंकि "मेग" में से एक पहले ही हटा दिया गया है, अब name.get(3) "मस्तिष्क" है। तो आप वास्तव में दूसरे "मेग" की जांच नहीं की थी।

समस्या को ठीक करने के लिए। आप सूचकांक घटती है जब आप एक तत्व निकाल सकते हैं:

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

     ArrayList<String> name = new ArrayList<String>(); 

     name.add("Chris"); 
     name.add("Lois"); 
     name.add("Meg"); 
     name.add("Meg"); 
     name.add("Brain"); 
     name.add("Peter"); 
     name.add("Stewie"); 

     System.out.println(name); 

     for (int i = 0; i < name.size(); i++){ 
      String oldName = name.get(i); 
      if(oldName.equals("Meg")) 
      { 
       name.remove(i); 
       i--; 
      } 
     } 

     System.out.println(name); 
    } 
} 
+0

हाँ, मैं इस बिंदु को याद कर रहा था .. धन्यवाद – CodeCrypt

1

आप 0 से एन तक इसे चालू करते समय ऐरेलिस्ट से हटा रहे हैं, इसलिए जब आप इंडेक्स एन पर पहला मेग हटाते हैं, तो अगला मेग इंडेक्स एन पर नीचे जाता है, तो आप एन + 1 में वृद्धि करते हैं। तो दूसरा मेग हटाया नहीं जाता है। (0 करने के लिए एन) विपरीत क्रम में पुनरावृत्ति का प्रयास करें:

for (int i = name.size() - 1; i >= 0; i--) { 
1

क्योंकि इसकी जब मैं = 2 और अगर हालत सच है तो मेग हटा दी जाती है और सभी सूचकांकों ऊपर स्थानांतरित कर दिया जाता है। इसलिए अगली मैं मस्तिष्क को इंगित करूंगा, मेग नहीं।

इसे आजमाएं। (यदि स्थिति सच्ची है तो एक से कम करें)

for (int i = 0; i < name.size(); i++){ 
      String oldName = name.get(i); 
      if(oldName.equals("Meg")) 
      { 
       name.remove(i); 
       i--; 
      } 
     } 
0

तत्वों को हटाने के दौरान आपको लूप के लिए उपयोग नहीं करना चाहिए। कुछ तर्क लागू करते समय यह हमेशा समस्याएं पैदा करता है। अपनी समस्या के लिए लूप के लिए रिवर्स का उपयोग करें और हमेशा प्रत्येक के लिए उपयोग करने का प्रयास करें।

4

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

[Chris, Lois, Meg, Meg, Brain, Peter, Stewie] 
    0  1  2 3  4  5  6 

पहले Meg हटा दिया जाता है, और पाश वेतन वृद्धि मैं क्योंकि यह पाश के लिए अंदर सब कुछ निष्पादन पूरा है, तो i अब 3 हो जाएगा और सरणी संशोधित किया गया है:

[Chris, Lois, Meg, Brain, Peter, Stewie] 
    0  1  2  3  4  5  

पीछे की ओर पुनरावृत्ति का प्रयास करें ।

for (int i = name.size() - 1; i >= 0; i--){ 
    String oldName = name.get(i); 
    if(oldName.equals("Meg")) 
    { 
     name.remove(i); 
    } 
} 
3

आप name.removeAll(Arrays.asList("Meg")); उपयोग कर सकते हैं सभी "Meg"

दूर करने के लिए अपनी पूरी कोड होगा

for (int i = 0; i < name.size(); i++){ 
    String oldName = name.get(i); 
    if(oldName.equals("Meg")) 
    { 
     name.removeAll(Arrays.asList("Meg")); 
    } 
} 
संबंधित मुद्दे