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

terça-feira, 30 de agosto de 2016

Zipando todos arquivos de um diretório com Java

Fala galera.

O código abaixo mostra como zipar todos os arquivos de um determinado diretório.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * Created by William Suane on 8/30/2016.
 */
public class ZipandoTest {
    public static void main(String[] args) {
        /*Esse é o path em que será salvo o arquivo.zip, lembre-se como o path não começa com / estamos trabalhando com o
          *path relativo. Isso significa que dentro da pasta do meu projeto existe o diretório pasta/subpasta
          *ex: C:\MeuProjetoJava\pasta\subpasta
          *No final ficará C:\MeuProjetoJava\pasta\subpasta\arquivo.zip
          */
        Path dirZip = Paths.get("pasta/subpasta");
        /*Dentro deste diretório estão todos os arquivos que queremos zipar. Vamos zipar todos os arquivos que estiverem
        * no diretório C:\MeuProjetoJava\pasta\subpasta\subsubpasta 
        */
        Path dirFiles = Paths.get("pasta/subpasta/subsubpasta");
        /* O resolve vai juntar o primeiro path "pasta/subpasta" com o "arquivo.zip"
         * e utilizaremos a variável de referência zipFile para criar o arquivo.zip dentro do diretório pasta/subpasta.
         */
        Path zipFile = dirZip.resolve("arquivo.zip");
        // Ao ser executado esse try-with-resources vai criar o arquivo.zip imediatamente
        try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile.toFile()));
             // Como vamos zipar todos os arquivos do diretório dirFiles apenas iteramos sobre eles usando DirectoryStream
             DirectoryStream<Path> stream = Files.newDirectoryStream(dirFiles)) {
            for (Path path : stream) {
                //Adicionamos ao arquivo.zip uma entrada ZipEntry, que será o arquivo que será copiado para dentro do zip
                zip.putNextEntry(new ZipEntry(path.getFileName().toString()));
                // O código abaixo copiará os dados do arquivo para o arquivo dentro do zip
                BufferedInputStream bf = new BufferedInputStream(new FileInputStream(path.toFile()));
                byte[] buff = new byte[2048];
                int bytesRead;
                while ((bytesRead = bf.read(buff)) > 0) {
                    zip.write(buff, 0, bytesRead);
                }
                zip.flush();
                zip.closeEntry();
                bf.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Espero que tenham gostado. Em breve um vídeo sobre esse código em nosso canal no YouTube. Se quiser aprender mais sobre Java, se liga nesse cursão porreta de java ;D