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

Comparar duas lista e gerar um terceira

Estou fazendo um projeto para testar meus conhecimentos e acabei me deparando com um problema que não estou conseguindo solucionar.

A idéia é ter três lista: jogadores, jodores escalados e jogadores não escalados.

A plicação funcionaria da seguinte maneira:

1° Cadastro os jogadores.

2° Cadastro os jogadores escalados, selecionando os jogadores da primeira lista pelo seu código.

3° Comparo as duas lista e todos os jogadores que não estiverem cadastrados na lista jogadores escalados, seriam cadastrados na lista jogadores não cadastrados

public void jogadoresNaoEscalados() {
        for (int i=0;i < jogador.size();i++) {
            jogador.get(i);
            int u = 0;
            boolean cont;
            cont = true;
            while ( u < jogadoresEscalados.size()) {
                if (jogadoresEscalados.get(u).getCodJogador() == jogador.get(i).getCodJogador()) {
                    cont = false;
                    break;
                } else if(jogadoresEscalados.get(u).getCodJogador() != jogador.get(i).getCodJogador()){
                    continue;
                }
                u++;
            }
            if (cont == false) {
                jogadoresNaoEscalados.add(new Jogador(jogadoresEscalados.get(u).getCodJogador(),jogadoresEscalados.get(u).getNome(),jogadoresEscalados.get(u).getCpf(),jogadoresEscalados.get(u).getDataDeNascimento()));
            }
        }
    }

Esse é o método que eu criei, mas não funciona como o esperado.

public void escalarJogadores(Jogador jog) {
        if (jog.apto()) 
        {
            if (jogador.size() == 0) {
                this.jogadoresEscalados.add(new Jogador(jog.getCodJogador(), jog.getNome(), jog.getCpf(), jog.getDataDeNascimento()));
            } else {
                for (int i = 0; i < jogadoresEscalados.size(); i++) {
                    Jogador joga = jogador.get(i);
                    if (jog.getCodJogador() == joga.getCodJogador()) {
                        throw new RuntimeException("Jogador ja escalado!! cod: " + joga.getCodJogador());
                    }
                }
            }
            this.jogadoresEscalados.add(new Jogador(jog.getCodJogador(), jog.getNome(), jog.getCpf(), jog.getDataDeNascimento()));
        } else
            throw new RuntimeException(" Jogador suspenso!!");        
    }

E esse para escalar os jogadores (caso seja necessário o conhecimento).

2 respostas
solução!

Lucas, a interface List do Java tem um método removeAll() que faz todo o trabalho pesado pra você:

List<String> jogadores = new ArrayList<>();
//populando a lista        
Collections.addAll(jogadores, "Pele", "Ronaldo", "Zidane", "Messi", "Iniesta");
List<String> escalados = new ArrayList<>();
//populando a outra lista
Collections.addAll(escalados, "Messi", "Iniesta");
//Crio uma lista igual à lista com todos os jogadores
List<String> naoEscalados = jogadores;
//Dessa lista, removo os escalados
naoEscalados.removeAll(escalados);
//Imprimo o nome de todos os jogadores não escalados
naoEscalados.forEach(jogador -> System.out.println(jogador));

Se tudo der certo, a saída deverá ser "Pele", "Ronaldo" e "Zidane". ;)

Funcionou muito bem, obrigado!!