Como fazer para não deixar inserir uma partida no arraylist caso já exista essa partida com o mesmo mando de campo?
Deixar só inserir a mesma partida se for em mando de campos diferente.
Embaixo o codigo que eu fiz até agora.
public class Partida
{
public String clube;
public String clubeVisitante;
public String estadio;
public int golsClube1;
public int golsClube2;
public Partida (String clube,String clubeVisitante , String estadio, int golsClube1, int golsClube2) {
this.clube = clube;
this.clubeVisitante = clubeVisitante;
this.estadio = estadio;
this.golsClube1 = golsClube1;
this.golsClube2 = golsClube2;
}
}
import java.util.ArrayList;
public class TestePartida extends junit.framework.TestCase{
public TestePartida(){
ArrayList<Partida> partidas = new ArrayList<Partida>();
partidas.add(new Partida("Palmeiras", "Santos" , "Palestra" , 2, 1));
partidas.add(new Partida("Palmeiras", "Santos" , "Palestra" , 2, 1));
for (Partida p : partidas) {
if(p.clube == p.clube and p.estadio==p.estadio) {
System.out.println("NÃO PODE INSERIR");
}
}
}
}
1 - o operador == só serve para comparar tipos primitivos (int, float, double, etc.) ou referências para objetos (testa se duas referências apontam para o mesmo objeto). Sendo assim, você usar == para comparar dois objetos diferentes (duas chamadas a new), o resultado será false, mesmo que seus campos possuam os mesmo valores.
2 - para compar objetos você deve usar o método equals(), presente em todas as classes (pois ele é definido na classe Object);
A melhor maneira de implementar o que você quer:
1 - na classe Partida, sobrescreva o método equals() para retornar true se e somente se o mando das partidas for igual (seria interessante se você incluisse o ano e a rodada da partida, ai você tem uma chave natural autêntica);
2 - uma vez que o método equals() esteja corretamente sobrescrito, basta usar um Set (HashSet, TreeSet, etc.) no lugar de ArrayList;
1 - o operador == só serve para comparar tipos primitivos (int, float, double, etc.) ou referências para objetos (testa se duas referências apontam para o mesmo objeto). Sendo assim, você usar == para comparar dois objetos diferentes (duas chamadas a new), o resultado será false, mesmo que seus campos possuam os mesmo valores.
2 - para compar objetos você deve usar o método equals(), presente em todas as classes (pois ele é definido na classe Object);
A melhor maneira de implementar o que você quer:
1 - na classe Partida, sobrescreva o método equals() para retornar true se e somente se o mando das partidas for igual (seria interessante se você incluisse o ano e a rodada da partida, ai você tem uma chave natural autêntica);
2 - uma vez que o método equals() esteja corretamente sobrescrito, basta usar um Set (HashSet, TreeSet, etc.) no lugar de ArrayList;
[/quote]
Esqueci de dizer isso hehe.
Só para complementar, o Eclipse pode sobrescrever os metodos equals e o hascode.
1 - o operador == só serve para comparar tipos primitivos (int, float, double, etc.) ou referências para objetos (testa se duas referências apontam para o mesmo objeto). Sendo assim, você usar == para comparar dois objetos diferentes (duas chamadas a new), o resultado será false, mesmo que seus campos possuam os mesmo valores.
2 - para compar objetos você deve usar o método equals(), presente em todas as classes (pois ele é definido na classe Object);
A melhor maneira de implementar o que você quer:
1 - na classe Partida, sobrescreva o método equals() para retornar true se e somente se o mando das partidas for igual (seria interessante se você incluisse o ano e a rodada da partida, ai você tem uma chave natural autêntica);
2 - uma vez que o método equals() esteja corretamente sobrescrito, basta usar um Set (HashSet, TreeSet, etc.) no lugar de ArrayList;
[/quote]
sobresquever o metodo equals seria isso?
public boolean equals(Pardida p){
if(this.nome == p.nome()){
Se não me engano o método equals tem que receber um Object. Uma implementação mais segura, que é a que o Eclipse gera, seria assim:public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Partida)) {
return false;
}
Partida other = (Partida) obj;
if (this.nome == null) {
if (other.nome != null) {
return false;
}
} else if (!this.nome.equals(other.nome)) {
return false;
}
return true;
}
[quote=jeff66]
sobresquever o metodo equals seria isso?
public boolean equals(Pardida p){
if(this.nome == p.nome()){
return true;
}else{
return false;
}
}[/quote]
Não. Em primeiro lugar o equals deve sempre receber um Object como parâmetro (se receber qualquer outra coisa ai não é sobrescrita).
Um exemplo válido:
class Teste {
private int inteiro;
private double decimal;
private Object objeto;
private String texto;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(decimal);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + inteiro;
result = prime * result + ((objeto == null) ? 0 : objeto.hashCode());
result = prime * result + ((texto == null) ? 0 : texto.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Teste other = (Teste) obj;
if (Double.doubleToLongBits(decimal) != Double
.doubleToLongBits(other.decimal)) {
return false;
}
if (inteiro != other.inteiro) {
return false;
}
if (objeto == null) {
if (other.objeto != null) {
return false;
}
} else if (!objeto.equals(other.objeto)) {
return false;
}
if (texto == null) {
if (other.texto != null) {
return false;
}
} else if (!texto.equals(other.texto)) {
return false;
}
return true;
}
}
Esse exemplo foi gerado pelo próprio Eclipse.
Lembrando que se você sobrescrever o equals você deve sobrescrever o hashCode também.
@Override
public boolean equals(Object obj) {
if (this == obj) { //primeiro compara se ambas variáveis apontam para o mesmo objeto
return true; //se sim então obviamente eles são o mesmo portanto retorna true
}
if (obj == null) { //Uma das regras do equals é que se você comparar o objeto
return false; //a uma referencia nula ele devera retornar false
}
if (getClass() != obj.getClass()) { //aqui testamos se eles são da mesma classe
return false; //se não forem da mesma classe retorna false
}
Teste other = (Teste) obj; //já que eles são da mesma classe podemos dar um casting sem problema
//agora comparamos os atributos.
if (Double.doubleToLongBits(decimal) != Double
.doubleToLongBits(other.decimal)) {
return false;
}
if (inteiro != other.inteiro) {
return false;
}
if (objeto == null) {
if (other.objeto != null) {
return false;
}
} else if (!objeto.equals(other.objeto)) {
return false;
}
if (texto == null) {
if (other.texto != null) {
return false;
}
} else if (!texto.equals(other.texto)) {
return false;
}
//se todos os atributos que queremos comparar forem iguais então ele retorna true
return true;
}
public String clube;
public String clubeVisitante;
public String estadio;
public int golsClube1;
public int golsClube2;
public Partida (String clube,String clubeVisitante , String estadio, int golsClube1, int golsClube2) {
this.clube = clube;
this.clubeVisitante = clubeVisitante;
this.estadio = estadio;
this.golsClube1 = golsClube1;
this.golsClube2 = golsClube2;
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Partida)) {
return false;
}
Partida other = (Partida) obj;
if (this.estadio == null) {
if (other.estadio != null) {
return false;
}
} else if (!this.estadio.equals(other.estadio)) {
return false;
}
return true;
}
Agora analisando o seu código você apenas compara os estádios.
Se você tivesse:
public static void main(String[] args) {
Partida a = new Partida("Santos", "Palmeiras", "Palestra", 2, 2);
Partida b = new Partida("Vasco", "Palmeiras", "Palestra", 1, 2);
Partida c = new Partida("São Paulo", "Palmeiras", "Palestra", 2, 3);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(a));
}
Você teria 3 true. Acredito que você terá que comparar todos os atributos.
E lembre-se, se sobrescrever o método equals você DEVE sobrescrever o hashCode.