Тізімнен элементтерді жою

Тізім бойынша циклда болғанда, жағдайға байланысты тізім элементін жойғым келеді. Төмендегі кодты қараңыз.

Бұл маған ConcurrentModification ерекшелігін береді.

for (Object a : list) {
    if (a.getXXX().equalsIgnoreCase("AAA")) {
        logger.info("this is AAA........should be removed from the list ");
        list.remove(a);
    }
}

Мұны қалай жасауға болады?

87
Сіз аталған тізім бойынша қайталанып жатқан кезде элементті тізімнен алып тастай алмайсыз. Оның орнына көшірме жасаңыз және элементтерді алып тастаңыз немесе оны тікелей иераторға жасаңыз.
қосылды автор thegrinner, көзі
Java 8-де, мұны істеудің ең тиімді жолы - тізімдегі removeIf (предикат) әдісі.
қосылды автор Holly Cummins, көзі
Java 8-де, мұны істеудің ең тиімді жолы - тізімдегі removeIf (предикат) әдісі.
қосылды автор Holly Cummins, көзі

8 жауаптар

for (Iterator iter = list.listIterator(); iter.hasNext(); ) {
    String a = iter.next();
    if (...) {
        iter.remove();
    }
}

Тізім жолдарға арналған қосымша болжам жасау. Жоғарыда айтылғандай, list.iterator() қажет. listIterator бірнеше әрекетті орындауы мүмкін навигация да.

185
қосылды

for iterator орнына Iterator қолданыңыз және remove() дегенді қолданыңыз.

62
қосылды

for iterator орнына Iterator қолданыңыз және remove() дегенді қолданыңыз.

62
қосылды

Мұны істей алмайсыз, себебі сіз оған кіріктіріп отырсыз.

Бұл жағдайды болдырмау үшін элементтерді тізімнен қауіпсіз түрде алып тастауға кепілдік беретін Итераторды қолданыңыз ...

List objs;
Iterator i = objs.iterator(); while (i.hasNext()) { Object o = i.next(); //some condition i.remove(); } 
27
қосылды

Тізімді өзгертуге болмайды және өзгерте алмайды. Сіз оны жою үшін объектілерді уақытша сақтау арқылы шеше аласыз:

List toRemove = new ArrayList(); for(Object a: list){ if(a.getXXX().equalsIgnoreCase("AAA")){ toRemove.add(a); } } list.removeAll(toRemove); 
15
қосылды
@AlexVentura Итератор үлгісі қалай жұмыс істейтіндігіне байланысты. Егер итератор тізімге өзгеретіні туралы айтса (әсіресе ол өлшемі), оны иератор білмесеңіз, оны қайталанатын болады.
қосылды автор André Stannek, көзі
Неге мен оны өзгерткенде тізімді өзгерте алмаймын және оны алмаймын?
қосылды автор Alex Ventura, көзі

Мұнда ұсынылған барлық тамаша шешімдерден басқа, басқа шешім ұсынғым келеді.

Мен тәуелділіктерді қосқыңыз келетініне сенімді емеспін, бірақ мүмкін болса, https://code.google.com/p/guava-libraries/ байланысты. Бұл кітапхана көптеген негізгі функционалдық операцияларды қолдау үшін Java-ге қосады және коллекциялармен жұмыс істеуді жеңілдетеді және оқитын болады.

Кода Т тізімінің түрін ауыстырдым, өйткені мен сіздің тізіміңіздің қандай түрге енгізілгенін білмеймін.

Бұл проблема гуавамен келесідей шешілуі мүмкін:

List filteredList = new Arraylist<>(filter(list, not(XXX_EQUAL_TO_AAA)));

Және сіз тағы бір жерде XXX_EQUAL_TO_AAA-ды келесідей анықтаңыз:

public static final Predicate XXX_EQUAL_TO_AAA = new Predicate() {
    @Override
    public boolean apply(T input) {
        return input.getXXX().equalsIgnoreCase("AAA");
    }
}

Дегенмен, бұл сіздің жағдайыңызда асып кетуі мүмкін. Бұл жинақтармен жұмыс істей отырып, барған сайын күшейе түсетін нәрсе.

Ох, сонымен қатар, бұл статикалық импорт қажет:

import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Collections2.filter;
7
қосылды
//first find out the removed ones

List removedList = new ArrayList();
for(Object a: list){
    if(a.getXXX().equalsIgnoreCase("AAA")){
        logger.info("this is AAA........should be removed from the list ");
        removedList.add(a);

    }
}

list.removeAll(removedList);
3
қосылды
Неліктен соншалықты күрделі ...
қосылды автор m0skit0, көзі
Қажет емес болғанда жаңа нысан жасайсыз және тізімді екі рет айналдыруыңыз мүмкін.
қосылды автор m0skit0, көзі
Бұл қиын емес. Оның басқа тізімін жоюдың тағы бір тәсілі.
қосылды автор Makky, көзі
//first find out the removed ones

List removedList = new ArrayList();
for(Object a: list){
    if(a.getXXX().equalsIgnoreCase("AAA")){
        logger.info("this is AAA........should be removed from the list ");
        removedList.add(a);

    }
}

list.removeAll(removedList);
3
қосылды
Неліктен соншалықты күрделі ...
қосылды автор m0skit0, көзі
Қажет емес болғанда жаңа нысан жасайсыз және тізімді екі рет айналдыруыңыз мүмкін.
қосылды автор m0skit0, көзі
Бұл қиын емес. Оның басқа тізімін жоюдың тағы бір тәсілі.
қосылды автор Makky, көзі