मैं उन वस्तुओं को क्लोन करने की कोशिश कर रहा हूं जिनमें स्ट्रिंग में चार एल है और स्ट्रिंग में चार आर वाले आइटम हटा दें, और कुछ भी नहीं करें जब एक ही स्ट्रिंग में वर्ण आर और एल मौजूद हों, हालांकि, जब मैं लागू करता हूं तो कुछ भी नहीं हो रहा है अगर कथन मैंने क्लोन के लिए बनाया है, लेकिन बाकी सब चीजों के लिए काम करता है।

मैंने एक लूप के लिए बनाया है जो सरणी सूची में प्रत्येक स्ट्रिंग के माध्यम से लूप करेगा। यह पहले जांच करेगा कि क्या उस अनुक्रमणिका में स्ट्रिंग में r और l दोनों हैं, और यदि है तो यह जारी रहेगा, तो यह जांच करेगा कि स्ट्रिंग में कोई r है या नहीं, यह इसे हटा देगा, फिर स्ट्रिंग्स की सूची लौटाएगा, यदि जाँच न करें कि क्या l और फिर सूची के अंतिम सूचकांक में समान तत्व जोड़ें।

package com.codegym.task.task07.task0716;

import java.util.ArrayList;

/* 
R or L

*/

public class Solution {
    public static void main(String[] args) throws Exception {
        ArrayList<String> list = new ArrayList<>();
        list.add("rose"); // 0
        list.add("love"); // 1
        list.add("lyre"); // 2
        list = fix(list);

        for (String s : list) {
            System.out.println(s);
        }
    }

    public static ArrayList<String> fix(ArrayList<String> list) {
        for (int i = 0; i < list.size(); i++)
        {
            if (list.get(i).contains("r") && list.get(i).contains("l"))
            {
                continue;
            } else if (list.get(i).contains("r"))
            {
                list.remove(i);
            } else if (list.get(i).contains("l"))
            {
                list.add(list.size()-1,list.get(i));
            }
        }

        return list;
    }
}
0
karina 18 अगस्त 2019, 04:25

3 जवाब

सबसे पहले, main में और आपके विधि प्रोग्राम में List इंटरफ़ेस (ArrayList कंक्रीट प्रकार के बजाय)। साथ ही, आप अपना प्रारंभिक list बनाने के लिए Arrays.asList का उपयोग कर सकते हैं। पसंद,

public static void main(String[] args) throws Exception {
    List<String> list = new ArrayList<>(Arrays.asList("rose", "love", "lyre"));
    list = fix(list);

    for (String s : list) {
        System.out.println(s);
    }
}

फिर, ConcurrentModificationException से बचने के लिए आपको Iterator.remove() (जैसा कि Javadoc नोट करता है एक पुनरावर्तक का व्यवहार अनिर्दिष्ट है यदि अंतर्निहित संग्रह को संशोधित किया जाता है जबकि पुनरावृत्ति किसी भी तरह से प्रगति पर है, इसके अलावा अन्य तरीके से इस विधि को कॉल करना)। और जोड़ने के लिए List को पार करने के बाद जोड़ने और फिर जोड़ने के लिए मदों की एक अस्थायी सूची बनाएं। और value को एक अस्थायी चर (list.get(index) दोनों में थकाऊ और तर्क करने में मुश्किल) में संग्रहीत करने से डरो मत। अंत में, आप अपने "contains l" और "contains r" परीक्षणों के परिणामों को वेरिएबल के साथ भी सहेज सकते हैं। कुछ इस तरह,

public static List<String> fix(List<String> list) {
    Iterator<String> iter = list.iterator();
    List<String> appendList = new ArrayList<>();
    while (iter.hasNext()) {
        String value = iter.next();
        boolean containsR = value.contains("r"), containsL = value.contains("l");
        if (containsR && containsL) {
            continue;
        } else if (containsR) {
            iter.remove();
        } else if (containsL) {
            appendList.add(value);
        }
    }
    list.addAll(appendList);
    return list;
}

कौन सा आउटपुट

love
lyre
love
1
Elliott Frisch 18 अगस्त 2019, 04:36

पुनरावृति करते समय सूची को संशोधित (जोड़/निकालें) न करें। यह अन्य संग्रह प्रकारों पर भी लागू होता है।

दो अलग-अलग सूचियाँ बनाए रखें - एक जोड़े जाने वाले तत्वों के लिए (addList) और दूसरी हटाए जाने वाले तत्वों के लिए (removeList)। अंत में, मुख्य सूची से आवश्यक तत्वों को हटा दें (removeList) और अन्य आवश्यक तत्व (addList) भी जोड़ें। जैसा कि ऊपर वर्णित है मैंने आपके कोड को थोड़ा संशोधित किया है।

import java.util.ArrayList;
import java.util.List;

public class DuplicateItemInList {
    public static void main(String[] args) throws Exception {
        ArrayList<String> list = new ArrayList<>();
        list.add("rose"); // 0
        list.add("love"); // 1
        list.add("lyre"); // 2
        list = fix(list);

        for (String s : list) {
            System.out.println(s);
        }
    }

    public static ArrayList<String> fix(ArrayList<String> list) {
        List<String> addList = new ArrayList<>();
        List<String> removeList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++)
        {
            if (list.get(i).contains("r") && list.get(i).contains("l"))
            {
                continue;
            } else if (list.get(i).contains("r"))
            {
                removeList.add(list.get(i));
            } else if (list.get(i).contains("l"))
            {
                addList.add(list.get(i));
            }
        }
        list.removeAll(removeList);
        list.addAll(addList);
        return list;
    }
}

आउटपुट:

love
lyre
love
0
fiveelements 18 अगस्त 2019, 04:41

लूप, इटरेटर और ConcurrentModificationExceptions के साथ खिलवाड़ करने के बजाय, स्ट्रीम का उपयोग करके एक-एक करके चरणों को करने का प्रयास करें।

सबसे पहले, उन स्ट्रिंग्स से छुटकारा पाएं जिनमें r है, लेकिन l नहीं। एक साधारण List#removeIf विधि कॉल पर्याप्त है।

//Remove strings that contain r but not l
list.removeIf(s -> s.contains("r") && !s.contains("l"));

अब "क्लोन" स्ट्रिंग्स देता है जिसमें l होता है, लेकिन r नहीं। ऐसा करने के लिए हम सूची को फ़िल्टर करेंगे और परिणाम को स्ट्रिंग्स की एक नई सूची में एकत्रित करेंगे। फिर उन्हें मूल सूची में जोड़ने के लिए List#addAll पर कॉल करें।

//Find all strings that contain l but not r
List<String> stringsThatContainLButNotR = list.stream().filter(s -> s.contains("l") && !s.contains("r"))
        .collect(Collectors.toList());
list.addAll(stringsThatContainLButNotR);

पूरा उदाहरण:

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("rose"); // 0
    list.add("love"); // 1
    list.add("lyre"); // 2

    //Remove strings that contain r but not l
    list.removeIf(s -> s.contains("r") && !s.contains("l"));

    //Find all strings that contain l but not r
    List<String> stringsThatContainsLButNotR = list.stream().filter(s -> s.contains("l") && !s.contains("r"))
            .collect(Collectors.toList());
    list.addAll(stringsThatContainsLButNotR);

    list.forEach(System.out::println);//prints "love","lyre","love"
}
1
George Z. 18 अगस्त 2019, 04:48