Ordenar Array com Sort

17 respostas
G

//Preciso ordenar o Array Items (listait) de acordo com o codigo do item, como fica isso na pratica?

MAIN

package App;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;

import javax.swing.JOptionPane;

import Model.Compra;
import Model.Itens;
import Model.Pessoa;
import Model.PessoaFisica;
import Model.PessoaJuridica;

public class AppPessoa {

	ArrayList<Pessoa> p = new ArrayList<Pessoa>();

	public static void main(String[] args) {

		boolean achou;

		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		Date dt = new Date();
		Compra c = new Compra();
		do {
			c.setData(JOptionPane.showInputDialog("Data da compra:"));
			try {
				dt = df.parse(c.getData());
				achou = true;
			} catch (Exception e) {
				achou = false;
			}
		} while (!achou);
		Itens l = new Itens();
		Pessoa p = new Pessoa();

		p.setIdade(Integer.parseInt(JOptionPane
				.showInputDialog("Idade da pessoa:")));
		p.setNome(JOptionPane.showInputDialog("Nome:"));
		p.add(p);
		while (!Pessoa.getNome().equalsIgnoreCase("")) {
			p.setPessoa(JOptionPane
					.showInputDialog("Pessoa jurídica ou física?\n J - Jurídica\n F - Física"));
			if (p.getPessoa().equalsIgnoreCase("J")) {
				String r = "";
				PessoaJuridica pj = new PessoaJuridica();
				pj.setCnpj(JOptionPane.showInputDialog("CNPJ:"));
				pj.setInscricao(JOptionPane.showInputDialog("Inscrição:"));

				r = JOptionPane
						.showInputDialog("Efetuar uma compra?\nS - Sim\nN - Não");
				if (r.equalsIgnoreCase("N")) {
					JOptionPane.showMessageDialog(null, "Você comprou 0 itens");
				}
				while (r.equalsIgnoreCase("S")) {
					l.setCodigo(JOptionPane.showInputDialog("Código do item:"));
					l.setDescricao(JOptionPane.showInputDialog("Descrição:"));
					l.setUnidade(Float.parseFloat(JOptionPane
							.showInputDialog("Unidade:")));
					l.setValorunitario(Float.parseFloat(JOptionPane
							.showInputDialog("Valor Unitário:")));
					r = JOptionPane
							.showInputDialog("Efetuar outra compra?\nS - Sim\nN - Não");
					pj.getCont();
					if (r.equalsIgnoreCase("N")) {
						JOptionPane.showMessageDialog(null, "Você comprou "
								+ pj.getCont() + " itens");

					}
					pj.setListaitem(l);
					pj.add(pj);
				}
				p.setNome(JOptionPane.showInputDialog("Nome:"));
				p.add(p);
				p.setPessoa(JOptionPane
						.showInputDialog("Pessoa jurídica ou física?\n J - Jurídica\n F - Física"));
			}
			if (p.getPessoa().equalsIgnoreCase("F")) {
				String r2 = "";
				PessoaFisica pf = new PessoaFisica();
				pf.setCpf(JOptionPane.showInputDialog("CPF:"));
				pf.setIdentidade(JOptionPane.showInputDialog("Identidade:"));

				r2 = JOptionPane
						.showInputDialog("Efetuar uma compra?\nS - Sim\nN - Não");
				if (r2.equalsIgnoreCase("N")) {
					JOptionPane.showMessageDialog(null, "Você comprou 0 itens");
				}
				while (r2.equalsIgnoreCase("S")) {
					l.setCodigo(JOptionPane.showInputDialog("Código do item:"));
					l.setDescricao(JOptionPane.showInputDialog("Descrição:"));
					l.setUnidade(Float.parseFloat(JOptionPane
							.showInputDialog("Unidade:")));
					l.setValorunitario(Float.parseFloat(JOptionPane
							.showInputDialog("Valor Unitário:")));
					r2 = JOptionPane
							.showInputDialog("Efetuar outra compra?\nS - Sim\nN - Não");
					pf.getCont();					 
					if (r2.equalsIgnoreCase("N")) {
						JOptionPane.showMessageDialog(null, "Você comprou "
								+ pf.getCont() + " itens");
					}
					pf.setListaitem(l);
					pf.add(pf);
				}
				p.setNome(JOptionPane.showInputDialog("Nome:"));
					p.add(p);
				
			}
		}
			Pessoa.maiorCompraPessoaFisica();
			Pessoa.menasCompraPessoaJuridica();
			
			
		}
	}

SERVICO

package Model;

import java.util.ArrayList;

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class Servico {

	ArrayList<PessoaFisica> pf = new ArrayList<PessoaFisica>();
	ArrayList<PessoaJuridica> pj = new ArrayList<PessoaJuridica>();
	ArrayList<Compra> comp = new ArrayList<Compra>();
	ArrayList<Itens> listait = new ArrayList<Itens>();
	ArrayList<Pessoa> p = new ArrayList<Pessoa>();
	
	public void setLista(Itens it) {
		this.listait.add(it);
	}
	public void setListapf(PessoaFisica pf) {
		this.pf.add(pf);
	}

	public String desc15() {
		float soma = 0;
		float tot = 0;
		String saux = "\n---\n";
		for (Itens i : listait) {
			soma += i.getValorunitario();
		}
		if (soma > 5000) {
			tot = (float) (tot - (soma * 0.15));
		}
		saux += "Valor com desconto de 15%: " + tot;
		return saux;
	}

	public String desc8() {
		float soma = 0;
		float tot = 0;
		String saux = "\n---\n";
		for (Itens i : listait) {
			soma += i.getValorunitario();
		}
		if (soma > 800) {
			tot = (float) (tot - (soma * 0.8));
		}
		saux += "Valor com desconto de 8%: " + tot;
		return saux;
	}

	public String desc3() {
		float soma = 0;
		float tot = 0;
		String saux = "\n---\n";
		for (Itens i : listait) {
			soma += i.getValorunitario();
		}
		tot = (float) (tot - (soma * 0.3));
		saux += "Valor com desconto de 3%: " + tot;
		return saux;
	}

	public void pFisicaqueMaiscomprou() {
		String saux = "\n---\n";
		String p = "";
		int valor = 0;
		for (PessoaFisica f : pf){
			if (f.getCont() > valor){
				valor = f.getCont();
			}
			saux += "Pessoa Física que mais efetuou compras: ";
			
			
			/*ArrayList<Pessoa> maiorQMedia = camara.getPerfMaiorQueMedia();
			ArrayList<Pessoa> p = getNome();
			String aux3 = "";
			for (Pessoa p : p)
			aux3 += v + "";
			JTextArea textoArea3 = new JTextArea(15, 30);
			textoArea3.setText(aux3);
			JOptionPane.showMessageDialog(null, new JScrollPane(textoArea3),
				"Teste: ",
				JOptionPane.INFORMATION_MESSAGE);
				
			JTextArea textoArea2 = new JTextArea(); 
			textoArea2.setText();
			JOptionPane.showMessageDialog(null, new JScrollPane(textoArea2),
			"Teste: ", JOptionPane.INFORMATION_MESSAGE);
		*/
		
		}

	}

}

17 Respostas

G

[quote=Guilherme Lessa]//Preciso ordenar o Array Items (listait) de acordo com o codigo do item, como fica isso na pratica?

Não entendo como implementar o sort nesse caso!

nel

Oi,

na realidade é bem simples, basta fazer com que uma determinada classe implementa a interface Comparator.
Eu normalmente, faço com que a classe que eu desejo que esteja ordenada implemente o próprio Comparator.
No caso dos Wrappers, isso é feito pelo próprio Java. Segue exemplo:

public class Pessoa implements Comparator {
 private Integer idade;
 // outros atributos, getters and setters

  @Override
  public int compare(Pessoa o1, Pessoa o2) {
      return o1.getIdade().compareTo(o2.getIdade());
  }
}

Ordenando:

Collections.sort(listPessoas, new Pessoa());
for(Pessoa pessoa : listPessoas)
    System.out.println(pessoa.getIdade());

Exemplo muito simples. Terás de verificar se não é nulo o objeto para comparar e etc.
Certo? Leia a API, para entender como funciona.

Abraços.

D

Guilherme,

Já existe alguns posts sobre esse tópico aqui no forum.

Segue links:

Espero ter ajudado.

Danilo Santos

G

Sim, ja li isso, mas não consigo entender onde e como isso entra no meu codigo.

Se alguem puder inserir um modo default nele agradeço.

G

Guilherme Lessa:
Sim, ja li isso, mas não consigo entender onde e como isso entra no meu codigo.

Se alguem puder inserir um modo default nele agradeço.

Eu ate entendo, mas tenho muito problema para implementar isso.

nel

Guilherme Lessa:
Guilherme Lessa:
Sim, ja li isso, mas não consigo entender onde e como isso entra no meu codigo.

Se alguem puder inserir um modo default nele agradeço.

Eu ate entendo, mas tenho muito problema para implementar isso.

O meu exemplo não ficou claro para você? Não serviu como startup?
Se as respostas foram não, qual a sua dificuldade ? :slight_smile:

G

nel:
Guilherme Lessa:
Guilherme Lessa:
Sim, ja li isso, mas não consigo entender onde e como isso entra no meu codigo.

Se alguem puder inserir um modo default nele agradeço.

Eu ate entendo, mas tenho muito problema para implementar isso.

O meu exemplo não ficou claro para você? Não serviu como startup?
Se as respostas foram não, qual a sua dificuldade ? :)

Tente colocar isso no meu codigo, sua nomenclatura não faz referência a minha, então nao sei o que é o que, entende.

nel

Guilherme,

eu simplesmente usei um outro objeto como exemplo, mas o modo de se fazer isso é praticamente o mesmo.
Tens de ler com mais calma as coisas e os exemplos, muito material sobre outros assuntos abordam de forma muito mais superficial o que eu expliquei.

Sobre sua necessidade, você precisa ordenar uma lista que contém objetos do tipo Itens.
Certo, faça o favor de postar sua classe Itens e por qual informação deseja que sua lista seja ordenada.

Rafael_Mesquita_Mour

nel bom dia,

Classificar uma lista utilizando algum tipo de parâmetro é muito simples. Existem duas formas de fazer a classificação.

A primeira delas é fazer com o que a classe dos objetos à serem classificados implemente a interface Comparable<T[color=red][/color]>. No seu caso, você precisa fazer com que a classe Item implemente a interface Comparable<T[color=red][/color]>.

Documentação na API: http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html

A implementação dessa interface é muito simples, ela possui apenas um método a ser implementado por quem utilizar a interface Comparable<T[color=red][/color]>, que é o método compareTo(T[color=red][/color] o). Esse método será invocado em cada elemento do seu conjunto pelo método estático sort() da classe Collections, para definir a ordem dos objetos dentro do conjunto. O método compareTo() possui três tipos de retorno, sendo:

-n - Quando o objeto passado no método, for maior que o objeto que invocou o método;

0 - Quanto o objeto passado for igual ao objeto que invocou o método;

n - Quando o objeto passado no método, for menor que o objeto que invocou o método;

Imagino que o código do item seja uma variável do tipo String. A classe String SABE como classificar algo alfabeticamente (ou numericamente), então basta você implementar dentro do método compareTo(T[color=red]*[/color] o), uma chamada a esse método (compareTo()) da classe String, passando o código do objeto que você recebeu:

public int compareTo(Item i){
    return this.item.compareTo(i.getItem());
}

A segunda forma de fazer a classificação do seu conjunto, criar uma outra classe que implemente a interface Comparator<T[color=red][/color]>. Essa forma de classificação é muito utilizada quando você quer classificar a mesma coisa (Item, por exemplo) de diversas formas (pelo código, pelo comprador, pelo preço, etc). Por se tratar de uma outra classe, significa que em cada classe nova que você criar (que implemente Comparator<T[color=red][/color]> ) você poderá ter uma forma de classificação diferente.

Documentação na API: http://download.oracle.com/javase/6/docs/api/java/util/Comparator.html

Para implementar essa interface, basta declarar que a sua classe implementa a interface Comparator<T[color=red][/color]>, dessa forma o compilador lhe obrigará a implementar o método compare(T[color=red][/color] o1, T[color=red]*[/color] o2). Quando você invocar o método Collections.sort() de dois argumentos a JVM saberá que deve buscar o método compare(), e dessa forma fará a classificação dos elementos do conjunto. Se sua variável do código do item for do tipo String, ela saberá como classificar algo alfabeticamente(ou numericamente).
O seu método compare(Item i1, Item i2) provavelmente terá a seguinte aparência:

public int compare(Item i1, Item i2){
    return i1.getCodigoItem().compareTo(i2.getCodigoItem());
}

[size=9][color=red]*[/color] - Esse T será substituído pelo tipo de objeto que você utilizar. Exemplo, se você criar um ArrayList<Pessoa>, o T será substituído por Pessoa, em todas as variáveis e métodos que utilizarem T.[/size]

Me corrijam se eu estiver enganado em algum ponto.
Espero ter ajudado!
^^

G

Ok, aqui esta Iten, seria por codigo, o seja:
o mesmo codigo, o produto ja existe, entao ordenaria por ordem de compra, o mais comprado (o codigo mais digitado);

Agradeço e peço desculpas pela ignorância :p
vou dar uma estudada nesse metodo sort.
Gracias

package Model;

public class Itens {
	
	
	private String codigo;
	private String descricao;
	protected float unidade;
	protected float valorunitario;

	public String getCodigo() {
		return codigo;
	}
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public float getUnidade() {
		return unidade;
	}
	public void setUnidade(float unidade) {
		this.unidade = unidade;
	}
	public float getValorunitario() {
		return valorunitario;
	}
	public void setValorunitario(float valorunitario) {
		this.valorunitario = valorunitario;
	}
	
	

}
nel

Rafael,

é o que estou tentando explicar, de modo muito mais resumido, ao Guilherme :slight_smile:

fernandosavio

o nel explicou bem, mas o cara não entendeu… Agora não entender a explicação no rafael (que foi muito boa) só tem uma explicação… Acho que você não sabe o que é uma interface e para que ela serve…
Se for esse o caso aconselho a ler com mais calma e ir por partes, começando por interfaces…

Rafael_Mesquita_Mour

@nel, desculpe, coloquei o seu nome no primeiro post, na verdade era o do Guilherme Lessa. Só pensei em passar como aprendi a utilizar.

Guilherme Lessa,

Faça:
package Model;  
  
public class Itens implements Comparable&lt;Itens&gt;{
    public int compareTo(Itens i){
        return this.getCodigo().compareTo(i.getCodigo());
    }

//... Outros métodos e variáveis da sua classe
}
E na invocação do método Collections.sort(), faça:
Collections.sort(listait);
^^
Rafael_Mesquita_Mour

@fernandosavio, valeu brother ^^, to aqui pra ajudar da forma que aprendi

nel

Segue:

public class Itens implements Comparator<Itens> {  
    
	private String codigo;  
    private String descricao;  
    protected float unidade;  
    protected float valorunitario;  
  
    public String getCodigo() {  
        return codigo;  
    }  
    public void setCodigo(String codigo) {  
        this.codigo = codigo;  
    }  
    public String getDescricao() {  
        return descricao;  
    }  
    public void setDescricao(String descricao) {  
        this.descricao = descricao;  
    }  
    public float getUnidade() {  
        return unidade;  
    }  
    public void setUnidade(float unidade) {  
        this.unidade = unidade;  
    }  
    public float getValorunitario() {  
        return valorunitario;  
    }  
    public void setValorunitario(float valorunitario) {  
        this.valorunitario = valorunitario;  
    }
	
    @Override
	public int compare(Itens o1, Itens o2) {
		if(null == o1 && null == o2)
			return 0;
		
		if(null == o1.getCodigo() && null == o2.getCodigo())
			return 0;
			
    	if(null == o1.getCodigo())
    		return 1;
    	
    	if(null == o2.getCodigo())
    		return -1;
    	
    	return o1.getCodigo().compareToIgnoreCase(o2.getCodigo());
	}  
        
}
Collections.sort(listItens, new Itens());
		for(Itens item : listItens)
			System.out.println(item.getCodigo());

Vai ordenar pelo seu código ignorando o case sensitive.
Não implementei a parte de se repetir código e bla bla bla, isso é com você.

Abraços.

G

Valeu pela ajuda pessoal, vou dar uma boa olhada nesses codigos com mais calma, meu Java do Deitel chegou ontem, to lendo, espero que ele acabe com algumas duvidas que eu estou tendo quanto a POO.

G

Valeu NEL!

Criado 5 de outubro de 2011
Ultima resposta 5 de out. de 2011
Respostas 17
Participantes 5