usando melhor as collections
DESCRIPTION
Palestra dada no Conexão Java 2012 sobre Collections no Java. Os códigos finais podem ser encontrados em: http://github.com/caelum/conexaojavaTRANSCRIPT
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?
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!