Problema em listar em ordem

5 respostas
O
package model;

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

import javax.swing.JOptionPane;

public class ServicoCompra {
	ArrayList<Pessoa> listaPessoa = new ArrayList<Pessoa>();
	public void setDados() {

		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");

		Date dtnasc = new Date();
		String d;
		String idade = null;
		String nome;
		String coditens1 = null;
		String descricao1 = null;
		int unidade1 = 0;
		double vlrunidade1 = 0;
		Date dtcompra1 = new Date();
		String c;
		String cpf;
		String identidade;
		String cnpj;
		String ie;
		boolean achou;
		String tipopessoa = null;
		int quant = 0;

		String pessoa1 = JOptionPane
				.showInputDialog("Pessoa Jurídica ou Física: ");

		while (!pessoa1.isEmpty()) {
			tipopessoa = pessoa1;
			nome = JOptionPane.showInputDialog("Nome:");
			
			idade = JOptionPane.showInputDialog("Idade: ");

			if (pessoa1.equalsIgnoreCase("Física")) {
				do {
					d = JOptionPane
							.showInputDialog("Data de Nascimento no formato dd/mm/aaaa: ");
					try {
						dtnasc = df.parse(d);
						achou = true;
					} catch (Exception e) {
						achou = false;
					}
				} while (!achou);

				cpf = JOptionPane.showInputDialog("Cpf: ");
				identidade = JOptionPane.showInputDialog("Identidade: ");
				Pessoa reg = new Fisica(dtnasc, idade, nome, tipopessoa, quant,
						cpf, identidade);
				listaPessoa.add(reg);

				// entra na listaCompra

				coditens1 = JOptionPane
						.showInputDialog("Digite o Código do produto: ");

				while ((!coditens1.isEmpty())) {
					descricao1 = JOptionPane
							.showInputDialog("Digite a Descrição do produto: ");
					vlrunidade1 = Double.parseDouble(JOptionPane
							.showInputDialog("Valor por Unidade: "));
					unidade1 = Integer.parseInt(JOptionPane
							.showInputDialog("Unidades: "));
					quant = unidade1;
					do {
						c = JOptionPane
								.showInputDialog("Data da Compra no formato dd/mm/aaaa: ");
						try {
							dtnasc = df.parse(c);
							achou = true;
						} catch (Exception e) {
							achou = false;
						}
					} while (!achou);

					reg.addCompra(coditens1, descricao1, unidade1, vlrunidade1,
							dtcompra1, pessoa1);
					coditens1 = JOptionPane
							.showInputDialog("Digite o Código do produto: ");
				}
			}

			// segunda condição

			else if (pessoa1.equalsIgnoreCase("Jurídica")) {
				do {
					d = JOptionPane
							.showInputDialog("Data de Nascimento no formato dd/mm/aaaa: ");
					try {
						dtnasc = df.parse(d);
						achou = true;
					} catch (Exception e) {
						achou = false;
					}
				} while (!achou);

				cnpj = JOptionPane.showInputDialog("Cnpj: ");
				ie = JOptionPane.showInputDialog("Inscrição Estadual: ");
				Pessoa reg = new Juridica(dtnasc, idade, nome, tipopessoa,
						quant, cnpj, ie);
				listaPessoa.add(reg);

				// entra na listaCompra

				coditens1 = JOptionPane
						.showInputDialog("Digite o Código do produto: ");
				while ((!coditens1.isEmpty())) {
					descricao1 = JOptionPane
							.showInputDialog("Digite a Descrição do produto: ");
					vlrunidade1 = Double.parseDouble(JOptionPane
							.showInputDialog("Valor por Unidade: "));
					unidade1 = Integer.parseInt(JOptionPane
							.showInputDialog("Unidades: "));
					quant = unidade1;
					do {
						c = JOptionPane
								.showInputDialog("Data da Compra no formato dd/mm/aaaa: ");
						try {
							dtnasc = df.parse(c);
							achou = true;
						} catch (Exception e) {
							achou = false;
						}
					}

					while (!achou);
					reg.addCompra(coditens1, descricao1, unidade1, vlrunidade1,
							dtcompra1, pessoa1);
					coditens1 = JOptionPane
							.showInputDialog("Digite o Código do produto: ");
				}
			} else
				JOptionPane.showMessageDialog(null, "Perfil Inesistente!!");

			pessoa1 = JOptionPane
					.showInputDialog("Pessoa Jurídica ou Física: ");
		}

	}

	// Apresenta todos os dados
	public String getDados() {
		String saux = "";
		for (int i = 0; i < listaPessoa.size(); i++) {
			saux += listaPessoa.get(i).toString();
			for (int j = 0; j < listaPessoa.get(i).getCompra().size(); j++) {
				saux += listaPessoa.get(i).getCompra().get(j).toString() + "\n";
			}
			saux += "\n\n----------------------------------------\n";
		}
		return saux;
	}
	// Lista de Itens vendidos mais pra menos
	public String getProdutoOrdem() {
		String saux = "";
		
		for (int i = 0; i < listaPessoa.size(); i++) {
			for (int j = 0; j < listaPessoa.get(i).getCompra().size(); j++) {
				
			}
			saux += listaPessoa.get(i).getCompra().toString()
			+ "\n========================================\n";	
			
		}
		Collections.sort(listaPessoa, new Comparator<Pessoa>() {
			public int compare(Pessoa f1, Pessoa f2) {
				return (int) (f1.getQuant() + f2.getQuant());
			}
		});
		return saux;

	}

}

O programa deveria listar os Produtos ao final pelo total de unidades compradas

alguem ajuda??

5 Respostas

gustavo_mb

Podemos tentar ajuda-lo se postar seu código dentro das tags code e devidamente identado. :roll:

ViniGodoy

Por favor:

  1. Ao postar tópicos, não escreve [URGENTE] ou [SOCORRO] no título. Ninguém é falta de educação solicitar urgência.
  2. Use as tags code, como descrito aqui: http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

Quanto à sua dúvida, dê uma olhada nesse post:

Para ordenar pelo total, você faz a subtração das unidades, e não a soma. Troque o sinal na linha 177.

marcelocenerine

Quando vc implementa um comparator, vc deve retornar:

0 => p1 igual p2
< 0 => p1 < p2

0 => p1 > p2

Sendo assim, seu comparator deveria ser:

Collections.sort(listaPessoa, new Comparator<Pessoa>() {
public int compare(Pessoa f1, Pessoa f2) {
return f1.getQuant().compareTo(f2.getQuant());
}
});
marcelocenerine

…ou faça a subtração como disse o ViniGodoy.

ViniGodoy

Uma dica. Java não é C. Então, vc não é obrigado a criar as variáveis no início das funções. Na verdade, isso nem sequer é desejável. Procure criar as variáveis no momento que for usa-las e já inicializa-las com valor. Isso não só deixará seu código bem mais curto e legível, como evitará possíveis bugs.

Além disso, não tenha preguiça de criar mais funções. Evite ao máximo repetições de código (copy&paste), pois isso forçará você a alterar todos os pontos onde copiou a função se alguma modificação tiver que ser feita. Sem falar que deixa o código porco, difícil de ler.

Veja a diferença:

package model;

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

import javax.swing.JOptionPane;

public class ServicoCompra {
    List&lt;Pessoa&gt; listaPessoa = new ArrayList&lt;Pessoa&gt;();

    private DateTime leData(String texto) {
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");

        while (true) {
            try {
                return df.parse(JOptionPane.showInputDialog(texto));
            } catch (Exception e) {
                JOptionPane.showMessageDialog("Data inválida, informe novamente!");                
            } 
        }
    }

    private void leCompras(Pessoa pessoa) {
        String cod = JOptionPane.showInputDialog("Digite o Código do produto: ");
        while (!cod.isEmpty()) {
            String descricao = JOptionPane.showInputDialog("Digite a Descrição do produto: ");
            String vlrunidade = Double.parseDouble(JOptionPane.showInputDialog("Valor por Unidade: "));  
            int quant = Integer.parseInt(JOptionPane.showInputDialog("Unidades: "));  
            DateTime dtCompra = leData("Data da Compra no formato dd/mm/aaaa: ");
            pessoa.addCompra(cod, descricao, quant, vlrunidade, dtCompra, pessoa);
            String cod = JOptionPane.showInputDialog("Digite o Código do produto: ");
        }
    }

    public void setDados() {
        String tipoPessoa = JOptionPane.showInputDialog("Pessoa Jurídica ou Física: ");
        while (!tipoPessoa.isEmpty()) {
            Pessoa reg = null;
            String nome = JOptionPane.showInputDialog("Nome:");
            int idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: "));
            
            if (tipoPessoa.equalsIgnoreCase("Física")) {
                DateTime dtNasc = leData("Data de Nascimento no formato dd/mm/aaaa: ");
                String cpf = JOptionPane.showInputDialog("Cpf: ");
                String rg = JOptionPane.showInputDialog("Identidade: ");
                reg = new Fisica(dtnasc, idade, nome, tipoPessoa, quant, cpf, rg);
            } else if (pessoa1.equalsIgnoreCase("Jurídica")) {
                DateTime dtNasc = leData("Data de Nascimento no formato dd/mm/aaaa: ");
                String cnpj = JOptionPane.showInputDialog("Cnpj: ");
                String ie = JOptionPane.showInputDialog("Inscrição Estadual: ");
                reg = new Juridica(dtnasc, idade, nome, tipopessoa,  quant, cnpj, ie);
            }
            if (reg != null) {
                leCompras(reg);
                listaPessoa.add(reg);
            }
            String tipoPessoa = JOptionPane.showInputDialog("Pessoa Jurídica ou Física: ");
        }
    }
}
Criado 6 de outubro de 2011
Ultima resposta 6 de out. de 2011
Respostas 5
Participantes 4