Usando melhor as Collections

Preview:

DESCRIPTION

Palestra dada no Conexão Java 2012 sobre Collections no Java. Os códigos finais podem ser encontrados em: http://github.com/caelum/conexaojava

Citation preview

Recapitulando... public class Onibus {

private String nome;private String linha;

public Onibus(String nome,

String linha) {this.nome = nome;this.linha = linha;

} // getters

}

Recapitulando... public class Onibus {

private String nome;private String linha;

public Onibus(String nome,

String linha) {this.nome = nome;this.linha = linha;

} // getters

}

Recapitulando...

Recapitulando...Peraí! Estávamos

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Recapitulando...

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Recapitulando...

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

Recapitulando...Bizarro!

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {this.____ = ____;this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Recapitulando...Bizarro!

Ninguém faz

assim!

Por que não?

Entendendo melhor as

Collections

Cecilia Fernandes@cecifernandesgithub.com/ceci

Antes de começarmos...

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

public class PontoDeOnibus {

private String nome;private double latitude;private double longitude;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome,

double latitude, double longitude) {// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

localizacao

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

Agora sim!

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passa

}

private ArrayList<Onibus>

private ArrayList<Onibus>

private LinkedList<Onibus>

private ArrayList<Onibus>

private LinkedList<Onibus>

private Vector<Onibus>

private ArrayList<Onibus>

private LinkedList<Onibus>

private Vector<Onibus>

Qual?

private ArrayList<Onibus>

private LinkedList<Onibus>

private Vector<Onibus>

Qual?

Tanto faz!

Qualquer coisa que seja uma...

List

Qualquer coisa que seja uma...

java.util.List

Qualquer coisa que seja uma...

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

Codingtime!

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

O getOnibuses também está

falho...

public List<Onibus> getOnibuses() {return onibuses;

} public List<Onibus> getOnibuses() {

return Collections.unmodifiableList(onibuses);}

Antes:

Depois:

public List<Onibus> getOnibuses() {return onibuses;

} public List<Onibus> getOnibuses() {

return Collections.unmodifiableList(onibuses);}

Antes:

Depois:

Mas...

Mas...

List?

Podia ser...

Set

TreeSet

TreeSet

TreeSet<

< <

< <

TreeSet<

< <

< <

>

>>

> >

HashSet

HashSet

HashSet

HashSet

?

HashSet

HashSet

HashSet

@Overridepublic int hashCode() {

final int prime = 31; int result = 1; result = prime * result + ((linha == null) ? 0 : linha.hashCode()); return result;

}

HashSet

@Overridepublic int hashCode() {

final int prime = 31; int result = 1; result = prime * result + ((linha == null) ? 0 : linha.hashCode()); return result;

}

HashSet

E aí...

TreeSet

TreeSet

LinkedList

ArrayList

TreeSet

LinkedList

ArrayList

TreeSet HashSet

LinkedList

ArrayList

TreeSet HashSet

LinkedList

Todos

servem!

ArrayList

TreeSet HashSet

LinkedList

Qualquer coisa

que seja uma..

ArrayList

TreeSet HashSet

LinkedList

Qualquer coisa

que seja uma..

Collection

E aí...

public class TestaBusao { public static void main(String[] args) { List<Onibus> onibuses = Arrays.asList(

new Onibus("2002/10", "TERMINAL BANDEIRA"), new Onibus("2290/10", "TERMINAL SÃO MATEUS"), new Onibus("5108/10", "JARDIM CELESTE"), new Onibus("5111/10", "TERMINAL SANTO AMARO"), new Onibus("5300/10", "TERMINAL SANTO AMARO"), new Onibus("6403/10", "TERMINAL JOÃO DIAS"), new Onibus("9300/10", "TERMINAL CASA VERDE"), new Onibus("3539/10", "CIDADE TIRADENTES"), new Onibus("3539/10", "TERMINAL CIDADE TIRADENTES"),

Vamos ver...

public class TestaBusao { public static void main(String[] args) { List<Onibus> onibuses = Arrays.asList(

new Onibus("2002/10", "TERMINAL BANDEIRA"), new Onibus("2290/10", "TERMINAL SÃO MATEUS"), new Onibus("5108/10", "JARDIM CELESTE"), new Onibus("5111/10", "TERMINAL SANTO AMARO"), new Onibus("5300/10", "TERMINAL SANTO AMARO"), new Onibus("6403/10", "TERMINAL JOÃO DIAS"), new Onibus("9300/10", "TERMINAL CASA VERDE"), new Onibus("3539/10", "CIDADE TIRADENTES"), new Onibus("3539/10", "TERMINAL CIDADE TIRADENTES"),

Vamos ver... performance!

LinkedList

ArrayList

TreeSet

HashSet

tempo

Então... performance!

public class PontoDeOnibus {

// atributos// construtor

public boolean passa(Onibus onibus) {

for (Onibus o : this.onibuses)if (o.getLinha().equals(onibus.getLinha()))

return true;return false;

} public void adicionaOnibus(Onibus onibus) {

if (!onibuses.contains(onibus)) {

Vamos ver...

public class PontoDeOnibus {

// atributos// construtor

public boolean passa(Onibus onibus) {

for (Onibus o : this.onibuses)if (o.getLinha().equals(onibus.getLinha()))

return true;return false;

} public void adicionaOnibus(Onibus onibus) {

if (!onibuses.contains(onibus)) {

Vamos ver... o adiciona!

public void adiciona (Onibus onibus) {

if (! onibuses.contains(onibus)) {onibuses.add(onibus);

}}

public void adiciona (Onibus onibus) {onibuses.add(onibus);

}

List

Set

public void adiciona (Onibus onibus) {

if (! onibuses.contains(onibus)) {onibuses.add(onibus);

}}

public void adiciona (Onibus onibus) {onibuses.add(onibus);

}

List

Set ...e é mais rápido para buscas!

Cool!

Cool!

Só vou usar Set, daqui pra frente!

Onibus tem...

public class Onibus {

private String nome;private String linha;

public Onibus(String nome, String linha) {

this.nome = nome;this.linha = linha;

} // getters

}

public class Onibus {

private String nome;private String linha;

public Onibus(String nome, String linha) {

this.nome = nome;this.linha = linha;

} // getters

}

public class Onibus {

private String nome;private String linha;private List<PontoDeOnibus> itinerario;

public Onibus(String nome, String linha,

List<PontoDeOnibus> itinerario) {this.nome = nome;this.linha = linha;this.itinerario = itinerario;

} // getters

}

Cool!

WAIT!

Quero a lista de ônibus

ordenada?

public class PontoDeOnibus {

private String nome;private Coordenada localizacao;private ArrayList<Onibus> onibuses;

public PontoDeOnibus(String nome, Coordenada localizacao) {

// ...this.onibuses = new ArrayList<Onibus>();

}// getters// adiciona e passaOnibus

}

Codar mais um pouquinho!

public class OrdenadoPorLinha

implements Comparator<Onibus>{@Overridepublic int compare(Onibus o1, Onibus o2) {

return o1.getLinha().compareTo(o2.getLinha());}

}

Comparator<Onibus>

...lections.sort(onibuses, new Comparator<Onibus>{

@Overridepublic int compare(Onibus o1, Onibus o2) {

return o1.getLinha().compareTo(o2.getLinha());}

});

Comparator<Onibus>

Classe anônima

Cool!

Cool!

Agora sim!

Entendendo melhor as

Collections

Cecilia Fernandes@cecifernandesgithub.com/ceci

Recommended