2013-10-18 5 views
5

हम इस प्रकार एक ArrayList के रूप में शब्दों की एक सूची दी गई हैं:एक ऐरेलिस्ट से दी गई लंबाई की स्ट्रिंग को हटा रहा है?

public ArrayList<String> getListOfStrings(){ 
    ArrayList<String> list = new ArrayList<String>(); 
    list.add("This"); 
    list.add("is"); 
    list.add("an"); 
    list.add("exercise"); 
    list.add("to"); 
    list.add("illustrate"); 
    list.add("the"); 
    list.add("use");   
    list.add("of"); 
    list.add("ArrayLists");   
    list.add("."); 
    return list; 
    } 

मैं एक विधि है कि सूची में सभी शब्दों को हटा कि (यानी सभी ArrayList में वस्तुओं) है कि कैसे लिख सकता हूँ उपयोगकर्ता द्वारा दर्ज लंबाई "लेन"?

मैं पहले से ही लिखा है एक विधि लंबाई के सभी शब्द "लेन" उपयोगकर्ता द्वारा दर्ज सूचीबद्ध करता है, और यह काम करता है, यह इस प्रकार है:

public ArrayList<String>getWordsWithLength(int len, ArrayList<String> lijst){ 
    ArrayList<String> list = new ArrayList<String>(); 
    for(String woord: lijst){ 
     if(woord.length()==len){ 
      list.add(woord); 
     } 
    } 
    return(list); 

} 

लेकिन जावा में अभी शुरुआत के रूप में, मैं अटक कर रहा हूँ लंबाई "लेन" के शब्दों को कैसे हटाएं। कृपया सहायता कीजिए! (मैं इस छाप के तहत हूं कि आप सूची के अंत से उन्हें हटाकर शुरू कर सकते हैं,

+0

आप उन्हें वापस लौटने वाली नई सूची में नहीं जोड़कर _remove_ उन्हें करेंगे। –

+5

बदलें '== 'से'! = ' – Cruncher

+1

पीछे की ओर भी काम करेगा, लेकिन केवल पारंपरिक' के लिए 'लूप के साथ (' int i = list.size-1; i> = 0; i--) 'विविधता। सारकोस का समाधान पसंद किया गया है हालांकि –

उत्तर

7

जिस प्रकार आप वर्तमान में सूची के माध्यम से पुनरावृत्ति करते हैं, वह आपको अपवाद के साथ हटाने की अनुमति नहीं देता है लेकिन एक इटरेटर होगा।

Iterator<String> it = list.iterator(); 
while(it.hasNext()) { 
if([Condition]) { 
    it.remove(); 
    } 
} 
+1

आप सही हैं, लेकिन असाइनमेंट ऊपर दिए गए रिचर्ड टिंगल द्वारा निर्दिष्ट सरल "के लिए" लूप का उपयोग करने के लिए निर्दिष्ट करता है: "पीछे भी काम करेगा, लेकिन केवल साथ ही लूप के लिए पारंपरिक (के लिए (int i = list.size-1; i> = 0; i--) विविधता। सारकोस का समाधान pr है हालांकि - " – user2895102

+1

@ user2895102 - आप लूप को उपरोक्त लूप में भी अनुवाद कर सकते हैं: '(Iterator it = list.iterator(); it.hasNext();) ... ' – DaoWen

1

आप एक Iterator का उपयोग कर एक ConcurrentModificationException को रोकने के लिए द्वारा एक List से मूल्यों को दूर करने के लिए किया है।

List<String> myList = getListOfStrings(); 
Iterator<String> it = myList.iterator(); 
while (it.hasNext()) { 
    if(it.next().length() == 3){ 
    it.remove(); 
    } 
} 
4

आपका पद्धति पहले से ही एक को हटाने के रूप में काम कर सकते हैं, बस == को बदलने के एक !=

public ArrayList<String> getStringsWithoutEqualLength(int len, ArrayList<String> lijst){ 
    ArrayList<String> list = new ArrayList<String>(); 
    for(String woord: lijst){ 
     if(woord.length() != len){ 
      list.add(woord); 
     } 
    } 
    return(list); 
} 

क्या आप lijst से तत्वों को दूर करने की कोशिश कर रहे हैं, तो बस लौटे सूची पुन: असाइन हैं इसके लिए

ArrayList<String> yourList = ...; 
yourList = instance.getStringsWithoutEqualLength(someLength, yourList); 

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

+0

क्या यह वास्तव में' Iterator' का उपयोग करने से तेज़ है? मैं उन्हें एक ही गति पर pegged होगा। 'Iterator' निरंतर समय में निष्कासन करने में सक्षम होना चाहिए? या यह केवल लिंक्ड सूचियों के लिए है? – Cruncher

+0

@ क्रंचर जो 'लिंक्डलिस्ट' के लिए होगा। 'ArrayList $ Itr'' ArrayList # निकालें() 'को कॉल करता है जो अंतर्निहित सरणी के लिए 'System.arraycopy' करता है। –

+0

@SotiriosDelimanolis लेकिन यह प्रभावी नहीं है कि आप क्या कर रहे हैं? ArrayList शून्य की प्रतिलिपि बनाना System.arraycopy के समान होगा सिवाय इसके कि आप कक्षाओं के गहरे पदानुक्रम को भी तत्काल बनाते हैं? – AbstractChaos

0

आप एक बूलियन पैरामीटर जोड़कर उसी विधि का भी उपयोग कर सकते हैं।

public ArrayList<String>getWordsWithLength(int len, ArrayList<String> lijst, boolean complement){ 
    ArrayList<String> list = new ArrayList<String>(); 
    for(String woord: lijst){ 
     if((woord.length()==len) != complement){ 
      list.add(woord); 
     } 
    } 
    return(list); 

} 

आप, true रूप complement में पार कर लेते हैं कि साथ length == len नहीं है, तो आप सब कुछ दे देंगे। complementfalse सामान्य रूप से व्यवहार करेगा।

List<String> list2 = list.stream() 
         .filter(s -> s.length() != 3) 
         .collect(Collectors.toList()); 

:

0

जबकि मुझे लगता है कि @ SotiriosDelimanolis का जवाब शायद आप क्या इस्तेमाल करना चाहिए है, मैं यह भी कहना है कि जावा 8 के साथ आप आसानी से पर फिल्टर करने के लिए एक Stream और एक Predicate का उपयोग कर ऐसा कर सकते हैं चाहता था यहाँ एक पूर्ण परीक्षण वर्ग है:

import java.util.*; 
import java.util.stream.*; 

class Test { 
    public static void main(String args[]) { 
    ArrayList<String> list = new ArrayList<String>(); 
    list.add("This"); 
    list.add("is"); 
    list.add("an"); 
    list.add("exercise"); 
    list.add("to"); 
    list.add("illustrate"); 
    list.add("the"); 
    list.add("use"); 
    list.add("of"); 
    list.add("ArrayLists"); 
    list.add("."); 
    System.out.println(list); 
    List<String> list2 = list.stream() 
          .filter(s -> s.length() != 3) 
          .collect(Collectors.toList()); 
    System.out.println(list2); 
    } 
} 

और अपने परीक्षण उत्पादन:

$ java Test 
[This, is, an, exercise, to, illustrate, the, use, of, ArrayLists, .] 
[This, is, an, exercise, to, illustrate, of, ArrayLists, .] 
0

स्कैला में आप केवल

list.filter(_.length != len) 
+0

[क्लोजर] में (http://clojure.org/) आप बस '(हटाएं # (= (गिनती%) लेन) मेरी सूची)' -लेकिन ओपी ने स्कैला या क्लोजर के बारे में नहीं पूछा था। हालांकि, जावा 8 _does_ एक स्कैला-एस्क्यू 'स्ट्रीम' पैकेज जोड़ें, जो मैंने अपने उत्तर में उपयोग किया था। बहुत बुरा हम लोगों को वास्तव में एक या दो साल के लिए _have_ जावा 8 की उम्मीद करने में सक्षम नहीं होंगे ... – DaoWen

संबंधित मुद्दे