Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro na execução do Collections.sort(lista)

Oi, nao sei se fiz algo de errado, mas pelo que vi está igual ao video... Mas quando eu executo essa ultima lista ordenada aparece um erro pra mim Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1095) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:1049) at br.com.alura.screenMatch.principal.PrincipalComListas.main(PrincipalComListas.java:30) na linha 30 do codigo está o ForEach... Alguem sabe me dizer o que pode ser?

package br.com.alura.screenMatch.principal;

import br.com.alura.screenMatch.modelos.Filme;
import br.com.alura.screenMatch.modelos.Serie;
import br.com.alura.screenMatch.modelos.Titulo;

import java.util.ArrayList;
import java.util.Collections;

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


        Filme meuFilme = new Filme("Batman", 2022);
        meuFilme.avalia(10);

        Filme segundoFilme = new Filme("Shang Shi", 2021);
        segundoFilme.avalia(8);

        Filme terceiroFilme = new Filme("John Wick", 2014);
        terceiroFilme.avalia(10);

        Serie serie = new Serie("Reacher", 2024);

        ArrayList<Titulo> lista = new ArrayList<>();
        lista.add(meuFilme);
        lista.add(segundoFilme);
        lista.add(terceiroFilme);
        lista.add(serie);
        for (Titulo item : lista) {
            System.out.println(item.getNome()); 
            if (item instanceof Filme filme && filme.getClassificacao() > 2){
                System.out.println("Classificaçao " + filme.getClassificacao());
            }

            //Fazer Ordenaçao de listas (dados)
            ArrayList<String> buscaArtista = new ArrayList<>();
            buscaArtista.add("Keanu Reeves");
            buscaArtista.add("Ana de Armas");
            buscaArtista.add("Salma Hayek");
            buscaArtista.add("Pedro Pascal");
            Collections.sort(buscaArtista);
            System.out.println("Busca ordenada");
            System.out.println(buscaArtista);

            System.out.println("Lista de titulos ordenados");
            Collections.sort(lista);
            System.out.println(lista);




        }
    }
}

Batman Classificaçao 5 Busca ordenada [Ana de Armas, Keanu Reeves, Pedro Pascal, Salma Hayek] Lista de titulos ordenados [Filme: Batman (2022) , Filme: John Wick (2014) , br.com.alura.screenMatch.modelos.Serie@2f2c9b19, Filme: Shang Shi (2021) ] Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1095) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:1049) at br.com.alura.screenMatch.principal.PrincipalComListas.main(PrincipalComListas.java:30)

Process finished with exit code 1

2 respostas
solução!

Oi Yago! Tudo bem?

A mensagem de erro ConcurrentModificationException geralmente ocorre quando tentamos modificar uma coleção enquanto a estamos percorrendo com um loop. No seu caso, o problema pode estar relacionado ao fato de você estar tentando ordenar a lista lista dentro do loop for-each que percorre essa mesma lista.

Para corrigir isso, você pode mover a parte do código onde ordena a lista para fora do loop for-each. Veja como você pode fazer isso:

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

        Filme meuFilme = new Filme("Batman", 2022);
        meuFilme.avalia(10);

        Filme segundoFilme = new Filme("Shang Shi", 2021);
        segundoFilme.avalia(8);

        Filme terceiroFilme = new Filme("John Wick", 2014);
        terceiroFilme.avalia(10);

        Serie serie = new Serie("Reacher", 2024);

        ArrayList<Titulo> lista = new ArrayList<>();
        lista.add(meuFilme);
        lista.add(segundoFilme);
        lista.add(terceiroFilme);
        lista.add(serie);

        // Ordenar a lista antes de percorrê-la
        Collections.sort(lista);

        for (Titulo item : lista) {
            System.out.println(item.getNome()); 
            if (item instanceof Filme filme && filme.getClassificacao() > 2) {
                System.out.println("Classificaçao " + filme.getClassificacao());
            }
        }

        // Fazer Ordenação de listas (dados)
        ArrayList<String> buscaArtista = new ArrayList<>();
        buscaArtista.add("Keanu Reeves");
        buscaArtista.add("Ana de Armas");
        buscaArtista.add("Salma Hayek");
        buscaArtista.add("Pedro Pascal");
        Collections.sort(buscaArtista);
        System.out.println("Busca ordenada");
        System.out.println(buscaArtista);

        System.out.println("Lista de titulos ordenados");
        System.out.println(lista);
    }
}

Dessa forma, a lista lista é ordenada antes de ser percorrida, evitando o erro ConcurrentModificationException. Além disso, verifique se a classe Titulo implementa a interface Comparable corretamente, para que a ordenação funcione como esperado.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Olá, funcionou da forma que voce explicou. Obrigado. Mas fiquei curioso... por que no da Jaqueline funcionou exatamente como tava o meu e pra mim nao.. tive que fazer essa manobra que voce explicou kkk E eu olhei o tudo e está exatamente igual kkkk.