How to compare two ArrayList and get the values shared by both?

12

I have two classes, they are:

Class FilterCity:

public class FiltroCidade {

    private int idCandidato;
    private List<String> cidades;

    public FiltroCidade(){ }

    public int getIdCandidato() {
        return idCandidato;
    }

    public void setIdCandidato(int idCandidato) {
        this.idCandidato = idCandidato;
    }

    public void addCidade(String cidade) {
        cidades.add(cidade);
    }

    public List<String> getCidades() {
        return cidades;
    }    
}

Job Class:

public class VagaEmprego {    
    private String nomeVaga;
    private String cidade;

    public VagaEmprego() { }    

    public VagaEmprego(String nomeVaga, String cidade) {        
        this.nomeVaga = nomeVaga;
        this.cidade = cidade;
    }

    public String getNomeVaga() {
        return nomeVaga;
    }

    public void setNomeVaga(String nomeVaga) {
        this.nomeVaga = nomeVaga;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }
}

And I have a ArrayList populated, it is:

ArrayList openings:

List<VagaEmprego> vagas = new ArrayList<>();
vagas.add(new VagaEmprego("Programador C", "Cruzeiro"));
vagas.add(new VagaEmprego("Programador Delphi", "Queluz"));
vagas.add(new VagaEmprego("Administrador", "Acre"));
vagas.add(new VagaEmprego("Programador Java", "Guaratingueta"));

And I have several cities added in the cidades attribute of my FiltroCidade class, see:

FiltroCidade filtroCidade = new FiltroCidade();
filtroCidade.setIdCandidato(1);
filtroCidade.addCidade("Cruzeiro");
filtroCidade.addCidade("Gotham");
filtroCidade.addCidade("Acre");

How can I get places where cities are the same as the cidades attribute of class FiltroCidade ?

    
asked by anonymous 04.11.2016 / 16:53

1 answer

14

With Java 8 you can resolve using expression lambda to filter only the records in which the city is contained within array of city filters.

List<VagaEmprego> encontradas = vagas
        .stream()
        .filter(p -> filtroCidade
                .getCidades()
                .contains(p.getCidade()))
        .collect(Collectors.toList());

From Java 5 you can use the predicate method.

  

According to the article Filtering Results (Predicates) - Java 8

     

...

...

import java.util.ArrayList;
import java.util.Collection;

public interface Predicado<T> {

  boolean aplicar(T tipo);

  public static <T> Collection<T> filtrar(Collection<T> colecao, Predicado<T> predicado) {
    Collection<T> resultado = new ArrayList<>();

    for (T elemento : colecao) {
      if (predicado.aplicar(elemento)) {
        resultado.add(elemento);
      }
    }

    return resultado;
  }
}

And using:

Predicado<VagaEmprego> predicado = new Predicado<VagaEmprego>() {
  public boolean aplicar(VagaEmprego vaga) {
    return filtroCidade.getCidades().contains(vaga.getCidade());
  }
};

Collection<VagaEmprego> encontradas = Predicado.filtrar(vagas, predicado);

In previous versions you can filter as follows:

List<VagaEmprego> encontradas = new ArrayList<>();

for (VagaEmprego vaga : vagas) {
  if (filtroCidade.getCidades().contains(vaga.getCidade())) {
    encontradas.add(vaga);
  }
}
    
04.11.2016 / 17:18