Collections.sort(list) nao coloca em ordem alfabetica, pq?

5 respostas
J
Boa tarde, estou tentando colocar em ordem alfabetica uma arraylist. so que ele não está ordenando ela. pq? Codigos: Metódo para achar os fornecedores dentro de uma lista pessoa e ordenar:
public static ArrayList<Fornecedor> imprimiTodosForne() throws Exception{
		ArrayList<Fornecedor> listaFornecedors = new ArrayList<>();
		for(Pessoa pessoaCad : listaPessoas){
			if(pessoaCad instanceof Fornecedor){
				Fornecedor fornecedor = (Fornecedor) pessoaCad;
				listaFornecedors.add(fornecedor);
			}
		}
		Collections.sort(listaFornecedors);
		return listaFornecedors;
		}
Metodo para imprimir:
private static void listaFornecedores() {
			try {
				ArrayList<Fornecedor> resposta = Comercial.imprimiTodosForne();
				System.out.println(resposta.toString());
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
			
		}
Classe pessoa:
package dados;

import java.io.Serializable;
import java.util.GregorianCalendar;

public abstract class Pessoa implements Comparable<Pessoa>, Serializable{
	
	public static final int CLIENTE = 1;
	public static final int VENDEDOR = 2;
	public static final int FORNECEDOR = 3;
	
	private int codigo;
	private String nome;
	private String telefone;
	private String email;
	private GregorianCalendar dataCad;
	
	public Pessoa(int codigo, String nome, String telefone, String email,
			GregorianCalendar dataCad) {
		super();
		this.codigo = codigo;
		this.nome = nome;
		this.telefone = telefone;
		this.email = email;
		this.dataCad = dataCad;
	}
// GET E SET AQUI

	public int compareTO(Pessoa o){
		return nome.compareTo(o.nome);
	} 

	@Override
	public String toString() {
		return  "Codigo: " + codigo + "\n" + 
				"Nome: " + nome + "\n" +
				"Telefone: " + telefone + "\n" + 
				"E-mail: " + email + "\n" +
				"Data de Cadastro: " + dataCad;
	}
	
	
		
}
Classe fornecedor:
package dados;

import java.util.GregorianCalendar;

import utilitarios.LtpUtil;

public class Fornecedor extends Pessoa {

	private String cnpj;
	private String nomeContato;
	
	public Fornecedor(int codigo, String nome, String telefone, String email,
			GregorianCalendar dataCad, String cnpj, String nomeContato) {
		super(codigo, nome, telefone, email, dataCad);
		this.cnpj = cnpj;
		this.nomeContato = nomeContato;
	}

//GET E SET AQUI

	public String toString() {
		return 
				"\nCodigo: " + getCodigo() + "\n" + 
				"Nome: " + getNome() + "\n" +
				"Telefone: " + getTelefone() + "\n" + 
				"E-mail: " + getEmail() + "\n" +
				"Data de Cadastro: " + LtpUtil.formatarData(getDataCad(), "dd/MM/yyyy") + "\n" +
				"CNPJ: " + LtpUtil.formatarCNPJ(cnpj) + "\n" + 
				"Nome do Contato: " + nomeContato;
	}

	@Override
	public int compareTo(Pessoa o) {
		return getNome().compareToIgnoreCase(getNome());
	}

}

Pq ele não coloca em ordem alfabetica? Alguem sabe?

5 Respostas

DaniloCRF

Uma das formas de se fazer.

Aluno a1 = new Aluno(1,"Danilo","[email removido]");
		Aluno a2 = new Aluno(2,"Danyelle","[email removido]");
		Aluno a3 = new Aluno(3,"Hugo","[email removido]");
		Aluno a4 = new Aluno(4,"Bernardo","[email removido]");
		
		List<Aluno> lista = new ArrayList<Aluno>();
		
		lista.add(a1);
		lista.add(a2);
		lista.add(a3);
		lista.add(a4);
		
		
		Collections.sort(lista, new Comparator<Aluno>() {@Override
		public int compare(Aluno o1, Aluno o2) {
			return o1.getNome().toUpperCase().compareTo(o2.getNome().toUpperCase());
		}
		});
		
		for(Aluno a : lista){
			
			System.out.println("Nome : " + a.getNome());
	
		}
thiago_dias

Veja o método compareTo na classe fornecedor…

@Override  
    public int compareTo(Pessoa o) {  
        return getNome().compareToIgnoreCase(getNome());  
    }

Você está comparando o nome da própria instância, por isso não está ordenando. O correto é pega o objeto Pessoa o

@Override public int compareTo(Pessoa o) { return getNome().compareToIgnoreCase(o.getNome()); }

E outra coisa… você já está implementando o método compareTo na classe Pessoa e, consequentemente, o herdando. Portanto, não há necessidade de sobrescrevê-lo para o mesmo objetivo (comparar os nomes)… isso é redundância.

Abrs

J

Muito obrigado “thiagoClaudino”, era isso mesmo.

Vlw a beça!
Fica com deus!

thiago_dias

Opa… estamos aí!

Abrs

ViniGodoy

Cuidado também com o nome do método. Você escreveu compareTO e o correto é compareTo. Trocar uma letra de minúscula por maiúscula faz diferença.
O pior, é que o compilador não faz a sobrecarga e encara o método compareTO como um novo método, sem dar erro nenhum.

Para evitar acidentes como esse coloque a anotação @Override sempre que for sobrescrever um método. Assim o compilador te dá um erro dizendo que seu método não está sobrescrevendo nada, caso você erre seu nome.

Criado 21 de outubro de 2012
Ultima resposta 21 de out. de 2012
Respostas 5
Participantes 4