Pessoal,
Tentei seguir os passos pelo vídeo, pela explicação e pelos exercícios, mas ao sobrescrever o equals e o hashCode de Gasto e de Funcionário, 3 resultados repetidos continuam sendo impressos, da mesma forma que acontecia antes da edição. Onde estou errando?
Segue o código
package br.com.caelum.empresa.modelo;
import java.util.Calendar;
public class Gasto {
private double valor;
private String tipo;
private Funcionario funcionario;
private Calendar data;
public Gasto(double valor, String tipo, Funcionario funcionario,
Calendar data) {
super();
this.valor = valor;
this.tipo = tipo;
this.funcionario = funcionario;
this.data = data;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
result = prime * result + ((funcionario == null) ? 0 : funcionario.hashCode());
result = prime * result + ((tipo == null) ? 0 : tipo.hashCode());
long temp;
temp = Double.doubleToLongBits(valor);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Gasto other = (Gasto) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
if (funcionario == null) {
if (other.funcionario != null)
return false;
} else if (!funcionario.equals(other.funcionario))
return false;
if (tipo == null) {
if (other.tipo != null)
return false;
} else if (!tipo.equals(other.tipo))
return false;
if (Double.doubleToLongBits(valor) != Double.doubleToLongBits(other.valor))
return false;
return true;
}
@Override
public String toString() {
return tipo + " do " + funcionario;
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public Funcionario getFuncionario() {
return funcionario;
}
public void setFuncionario(Funcionario funcionario) {
this.funcionario = funcionario;
}
public Calendar getData() {
return data;
}
public void setData(Calendar data) {
this.data = data;
}
}
package br.com.caelum.empresa.modelo;
import java.util.Calendar;
public class Funcionario {
private String nome;
private int matricula;
private Calendar dataNascimento;
public Funcionario(String nome, int matricula, Calendar dataNascimento) {
this.nome = nome;
this.matricula = matricula;
this.dataNascimento = dataNascimento;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dataNascimento == null) ? 0 : dataNascimento.hashCode());
result = prime * result + matricula;
result = prime * result + ((nome == null) ? 0 : nome.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;
Funcionario other = (Funcionario) obj;
if (dataNascimento == null) {
if (other.dataNascimento != null)
return false;
} else if (!dataNascimento.equals(other.dataNascimento))
return false;
if (matricula != other.matricula)
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
return true;
}
@Override
public String toString() {
return "Funcionario: " + nome;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getMatricula() {
return matricula;
}
public void setMatricula(int matricula) {
this.matricula = matricula;
}
public Calendar getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Calendar dataNascimento) {
this.dataNascimento = dataNascimento;
}
}
package br.com.caelum.empresa.leitor;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Scanner;
import br.com.caelum.empresa.modelo.Funcionario;
import br.com.caelum.empresa.modelo.Gasto;
public class ImportadorDeGastos {
private SimpleDateFormat df = new SimpleDateFormat("ddMMyyyy");
public Collection<Gasto> importa(InputStream entrada) throws ParseException {
Scanner leitor = new Scanner(entrada);
Collection<Gasto> gastos = new LinkedHashSet<Gasto>();
while (leitor.hasNextLine()) {
String line = leitor.nextLine();
String tipoDeGasto = line.substring(0, 6);
String dataGastoTxt = line.substring(6, 14);
String valorTxt = line.substring(14, 23);
String matriculaTxt = line.substring(23, 26);
String nome = line.substring(26, 56);
String dataNascTxt = line.substring(56);
double valor = Double.parseDouble(valorTxt);
int matricula = Integer.parseInt(matriculaTxt);
Calendar dataNascimento = converteDataTxtParaCalendar(dataNascTxt);
Calendar dataDespesa = converteDataTxtParaCalendar(dataGastoTxt);
Funcionario funcionario = new Funcionario(nome, matricula,
dataNascimento);
gastos.add(new Gasto(valor, tipoDeGasto, funcionario, dataDespesa));
}
return gastos;
}
private Calendar converteDataTxtParaCalendar(String dataNascTxt)
throws ParseException {
Calendar dataNascimento = Calendar.getInstance();
dataNascimento.setTime(df.parse(dataNascTxt));
return dataNascimento;
}
}
package br.com.caelum.empresa;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.util.Collection;
import br.com.caelum.empresa.leitor.ImportadorDeGastos;
import br.com.caelum.empresa.modelo.Gasto;
public class TesteImportador {
public static void main(String[] args) throws UnsupportedEncodingException,
ParseException {
String conteudo =
"CARTAO01012011000010000123Jose da Silva 22071983\r\n" +
"CARTAO01012011000010000123Jose da Silva 22071983\r\n" +
"CARTAO01012011000010000123Jose da Silva 22071983\r\n";
ImportadorDeGastos importador = new ImportadorDeGastos();
Collection<Gasto> list = importador.importa(new ByteArrayInputStream(
conteudo.getBytes("UTF-8")));
for (Gasto gasto : list) {
System.out.println(gasto);
}
}
}