quinta-feira, 8 de setembro de 2016

Usando Iterator para remover elementos de uma lista enquanto a percorre

Quem nunca precisou remover elementos de uma lista fazendo um if dentro de um laço? Se você ainda não precisou, acredite, vai precisar um dia. Existem várias formas de fazer, porém acredito que utilizando Iterator é a forma mais simples.

Poderíamos usar um exemplo bem simples criando uma List<String> ou List<Integer>, mas você provavelmente vai se deparar com esse mesmo problema utilizando objetos. O objetivo aqui é remover todos os produtos, de uma lista, que possuem a quantidade igual a zero.

Primeiramente crie uma classe produto. Essa classe implementa a interface Comparable<Produto> pois a utilizamos em nossa vídeo aula. O mais importante aqui é fazer o @Override do método equals() e hashCode(), uma vez que estamos trabalhando com coleções.



/**
 * Created by William Suane on 9/6/2016.
 */
public class Produto implements Comparable<Produto>{

    private String serialNumber;
    private String nome;
    private Double preco;
    private int quantidade;

    public Produto(String serialNumber, String nome, Double preco, int quantidade) {
        this.serialNumber = serialNumber;
        this.nome = nome;
        this.preco = preco;
        this.quantidade = quantidade;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Produto produto = (Produto) o;

        return serialNumber != null ? serialNumber.equals(produto.serialNumber) : produto.serialNumber == null;

    }

    @Override
    public int hashCode() {
        return serialNumber != null ? serialNumber.hashCode() : 0;
    }

    @Override
    public String toString() {
        return "Produto{" +
                "serialNumber='" + serialNumber + '\'' +
                ", nome='" + nome + '\'' +
                ", preco=" + preco +
                ", quantidade=" + quantidade +
                '}';
    }

    public void setPreco(Double preco) {
        this.preco = preco;
    }

    public int getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    public String getSerialNumber() {
        return serialNumber;
    }

    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    @Override
    public int compareTo(Produto outroObjeto) {
        return this.preco.compareTo(outroObjeto.getPreco());
    }
}

Agora crie uma classe chamada IteratorTest. Nessa classe nós criamos e preenchemos uma lista de produtos e percorremos essa lista utilizando um Iterator. Dentro do while checamos se a quantidade do produto é zero, se for nós removemos da lista.


import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by William Suane on 9/8/2016.
 */
public class IteratorTest {
    public static void main(String[] args) {
        List<Produto> produtos = new LinkedList<>();
        Produto produto1 = new Produto("123", "Laptop Lenovo", 2000.0, 10);
        Produto produto2 = new Produto("321", "Picanha", 10d, 10);
        Produto produto3 = new Produto("879", "Teclado Razer", 1000.0, 0);
        Produto produto4 = new Produto("012", "Samsung galaxy S7 64Gb", 3250.5, 0);
        produtos.add(produto1);
        produtos.add(produto2);
        produtos.add(produto3);
        produtos.add(produto4);
        Iterator<Produto> produtoIterator = produtos.iterator();
        while (produtoIterator.hasNext()) {
            if (produtoIterator.next().getQuantidade() == 0) {
                produtoIterator.remove();
            }
        }
        System.out.println(produtos.size());

    }
}

É isso ai galera, se quiser aprender mais sobre Java temos um SENHOR curso no Youtube