Ordenando um ArrayList de Objetos

3 respostas
ismael_moraes

Socorro não arrumei um jeito de ordenar essa lista de array de objetos , no caso a problema esta na função Ordena() no arquivo main
A parte de leitura do XML e criação dos objetos, gravação em uma txt ta ok , mas falta essa ordenação.
To quebrando a cabeça , e tenho que entregar amanhã na Faculdade. :?:

BoletosXML.java
/**
 * @author Ismael Ramos Moraes
 * Description Classe que define tipo de boleto
 * */
public class BoletosXML
{
	// atributos(catacteristicas) da classe Boleto
	private String numero;
	private String vcto;
	private String valor;
	private String cliente;
	
		
	// get set da classe
	public void setCliente(String cliente) {
		this.cliente = cliente;
	}
	public String getCliente() {
		return cliente;
	}
	public void setValor(String valor) {
		this.valor = valor;
	}
	public String getValor() {
		return valor;
	}
	public void setVcto(String vcto) {
		this.vcto = vcto;
	}
	public String getVcto() {
		return vcto;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public String getNumero() {
		return numero;
	}
	
	
}

Classe Main.java
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;



public class Main
{	
	public static void main(String[] args)
	{		
		try{
			GravaArquivo(LerBoletosXML("C:\BoletosXML\boletos.xml"),"C:\BoletosXML\boletos.txt");
		}catch (ParserConfigurationException e) {e.printStackTrace();}
		 catch (SAXException e) {e.printStackTrace();}
		 catch (IOException e) {e.printStackTrace();}
		 
		 try {
			Ordena(LerBoletosXML("C:\BoletosXML\boletos.xml"));
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
	}	
		/**
		 * @param String arquivo - local doa rquivo xml
		 * @throws ParserConfigurationException 
		 * @throws IOException 
		 * @throws SAXException 
		 * @description Realiza leitura do arquivo xml no disco 
		 * **/	
		public static  ArrayList<BoletosXML> LerBoletosXML(String arquivo) throws ParserConfigurationException, SAXException, IOException
		{
			/*cria ArrayList de Instancias de BoletosXml */
			ArrayList<BoletosXML> Boletos= new ArrayList<BoletosXML>();
	
			  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			  DocumentBuilder db = dbf.newDocumentBuilder();
			  Document doc = db.parse(arquivo);
			  
			  Element elem = doc.getDocumentElement();
			// pega todos os elementos boletos do XML
			 NodeList boletos_list = elem.getElementsByTagName( "boleto" );
			
			 // percorre cada elemento boleto encontrado
			 for( int i=0; i<boletos_list.getLength(); i++ )
			 {
			 	Element tagBoleto = (Element) boletos_list.item(i);
			 	// pega os dados cadastrado para o boleto atual		 	
			 	String numero =null, vcto = null, valor = null, cliente = null;
			 		try
				{
			 		numero= getChildTagValue( tagBoleto, "numero" );
					vcto = getChildTagValue( tagBoleto, "vcto" );
					valor = getChildTagValue( tagBoleto, "valor" );
					cliente = getChildTagValue( tagBoleto, "cliente" );
				} catch (Exception e){e.printStackTrace();}
				// criando uma instancia(objeto)da classe BoletosXML e atribui valores 	
			 	BoletosXML b=new BoletosXML();
				b.setNumero(numero);
				b.setVcto(vcto);
				b.setValor(valor);
				b.setCliente(cliente);
				// add instância no ArrayList de Objetos BoletosXML
			 	Boletos.add(b);
			 }
			 return Boletos;
			 	
		}//Fim metodo LerBoletoXML
		/**
		 * @param Element elem, String tagName
		 * @description este método lê e retorna o conteúdo (texto) de uma tag (elemento)
		 *  filho da tag informada como parâmetro(tagName)
		 * */
		public static  String getChildTagValue( Element elem, String tagName ) throws Exception
		{
			NodeList children = elem.getElementsByTagName( tagName );
			if( children == null ) return null;
	    		Element child = (Element) children.item(0);
			if( child == null ) return null;
			return child.getFirstChild().getNodeValue();
		}
		
		/** 2) Um método de ordenação que receba como parâmetro uma lista (ArrayList)
		 * de instâncias dos boletos, e de posse desta lista, faça a ordenação de todas as instâncias,
		 * usando o número do boleto como chave de ordenação. 
		 * */
		public static void Ordena(ArrayList <BoletosXML> Boleto)
		{
			for (int x=0;x<Boleto.size()-1;x++)
			{  
				BoletosXML b=new BoletosXML();
				String n1=Boleto.get(x).getNumero();String n2=Boleto.get(x+1).getNumero();
				int v=n1.compareToIgnoreCase(n2);
				if(v<0)
				{  
					// aqui os dados da posição x+1 sao inseridos na posição de x
				
					System.out.println (Boleto.get(x).getNumero());

					String tempNumero=Boleto.get(x).getNumero();
					String tempVcto=Boleto.get(x).getVcto();
					String tempValor=Boleto.get(x).getValor();
					String tempCliente=Boleto.get(x).getCliente();
					
					b.setNumero(Boleto.get(x+1).getNumero());
					b.setVcto(Boleto.get(x+1).getVcto());			
					b.setValor(Boleto.get(x+1).getValor());
					b.setCliente(Boleto.get(x+1).getCliente());

					Boleto.set(x, b);
				}
			     /*
			     System.out.println (Boleto.get(x).getNumero());
			     System.out.println(Boleto.get(x).getVcto()); 
			     System.out.println (Boleto.get(x).getValor()); 
			     System.out.println (Boleto.get(x).getCliente()); 
			     System.out.println("Boletoto em x +1");
			     System.out.println (Boleto.get(x+1).getNumero());
			     System.out.println(Boleto.get(x+1).getVcto()); 
			     System.out.println (Boleto.get(x+1).getValor()); 
			     System.out.println (Boleto.get(x+1).getCliente());
			    */
			 } 
			
		}

		/**
		 * @param Boleto é ArrayList de BoletosXML
		 * @param arq String-local para gravação ex:C:\BoletosXML\boletos.txt
		 * @description Realiza Gravação do arquivo txt no disco 
		 * **/
		public static void GravaArquivo(ArrayList <BoletosXML> Boleto, String arq)
		{
			// acessa arquivo fisico na maquina
			FileWriter arquivo;
			try {
					arquivo = new FileWriter(arq);
					BufferedWriter buffer=new BufferedWriter(arquivo);
					for(int x=0;x<(Boleto.size());x++)
					{					

						String Numero=Boleto.get(x).getNumero();
						String Vcto=Boleto.get(x).getVcto();
						String Valor=Boleto.get(x).getValor();
						String Cliente=Boleto.get(x).getCliente();
						//[telefone removido];07/08/2010;123.78;joao da silva
						buffer.write(Numero+";"+Vcto+";"+Valor+";"+Cliente);
						buffer.newLine();

					}
						
					// fehar buffer para gravar no arquivo // feccha arquivo
					buffer.close();				
					arquivo.close();
				
			     } catch (IOException e){ e.printStackTrace(); }
			   }

}

arquivo XML

boletos.xml
<?xml version="1.0" encoding="utf-8"?>
<boletos>
    <boleto>
        <numero>[telefone removido]</numero>
        <vcto>02/09/2010</vcto>
        <valor>789.25</valor>
        <cliente>albuquerque, maria</cliente>
    </boleto>
    <boleto>
        <numero>[telefone removido]</numero>
        <vcto>06/07/2010</vcto>
        <valor>237.18</valor>
        <cliente>ferlon, renata alonzo</cliente>
    </boleto>
    <boleto>
        <numero>[telefone removido]</numero>
        <vcto>07/08/2010</vcto>
        <valor>123.78</valor>
        <cliente>silva, joao da</cliente>
    </boleto>
</boletos>

3 Respostas

L

Dá uma pesquisada sobre comparator que é feito pra isso, ordenar objetos…

L

Crie uma classe que implementa a interface Comparator, sobrescreva o método compare. Crie uma instância dessal Classe Comparadora e passe a sua lista e o objeto comparador no método sort da interface Collection:

Collection.sort(suaLista, objetoComparador)
ismael_moraes

Galera Tudo resolvido depois de algumas horas de estudo e pesquisa um verdadeiro milagre aconteceu!
Ai vai as alterações que fiz ,para fim de consulta pra galera.
Valeu Lucas e leopoldof :smiley: Dicas pequenas mas fundamnetais.
Esses sao os codigos:

Classe Main.java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Main
{	
	public static void main(String[] args)
	{	boletoComparator comparadorPorNome = new boletoComparator(); 

		try{
			
			GravaArquivo(Ordena(LerBoletosXML("C:\BoletosXML\boletos.xml"), comparadorPorNome),"C:\BoletosXML\boletos.txt");
		}catch (ParserConfigurationException e) {e.printStackTrace();}
		 catch (SAXException e) {e.printStackTrace();}
		 catch (IOException e) {e.printStackTrace();}
		 
		 
	}	
		/**
		 * @param String arquivo - local doa rquivo xml
		 * @throws ParserConfigurationException 
		 * @throws IOException 
		 * @throws SAXException 
		 * @description Realiza leitura do arquivo xml no disco 
		 * **/	
		public static  ArrayList<BoletosXML> LerBoletosXML(String arquivo) throws ParserConfigurationException, SAXException, IOException
		{
			/*cria ArrayList de Instancias de BoletosXml */
			ArrayList<BoletosXML> Boletos= new ArrayList<BoletosXML>();
	
			  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			  DocumentBuilder db = dbf.newDocumentBuilder();
			  Document doc = db.parse(arquivo);
			  
			  Element elem = doc.getDocumentElement();
			// pega todos os elementos boletos do XML
			 NodeList boletos_list = elem.getElementsByTagName( "boleto" );
			
			 // percorre cada elemento boleto encontrado
			 for( int i=0; i<boletos_list.getLength(); i++ )
			 {
			 	Element tagBoleto = (Element) boletos_list.item(i);
			 	// pega os dados cadastrado para o boleto atual		 	
			 	String numero =null, vcto = null, valor = null, cliente = null;
			 		try
				{
			 		numero= getChildTagValue( tagBoleto, "numero" );
					vcto = getChildTagValue( tagBoleto, "vcto" );
					valor = getChildTagValue( tagBoleto, "valor" );
					cliente = getChildTagValue( tagBoleto, "cliente" );
				} catch (Exception e){e.printStackTrace();}
				// criando uma instancia(objeto)da classe BoletosXML e atribui valores 	
			 	BoletosXML b=new BoletosXML();
				b.setNumero(numero);
				b.setVcto(vcto);
				b.setValor(valor);
				b.setCliente(cliente);
				// add instância no ArrayList de Objetos BoletosXML
			 	Boletos.add(b);
			 }
			 return Boletos;
			 	
		}//Fim metodo LerBoletoXML
		/**
		 * @param Element elem, String tagName
		 * @description este método lê e retorna o conteúdo (texto) de uma tag (elemento)
		 *  filho da tag informada como parâmetro(tagName)
		 * */
		public static  String getChildTagValue( Element elem, String tagName ) throws Exception
		{
			NodeList children = elem.getElementsByTagName( tagName );
			if( children == null ) return null;
	    		Element child = (Element) children.item(0);
			if( child == null ) return null;
			return child.getFirstChild().getNodeValue();
		}
		
		/** 2) Um método de ordenação que receba como parâmetro uma lista (ArrayList)
		 * de instâncias dos boletos, e de posse desta lista, faça a ordenação de todas as instâncias,
		 * usando o número do boleto como chave de ordenação. 
		 * @return 
		 * */
		public static ArrayList<BoletosXML> Ordena(ArrayList <BoletosXML> Boleto,boletoComparator b)
		{ List<BoletosXML> boleto = Boleto;      
			  Collections.sort(boleto, b);
			return Boleto;
			
		}
		public static void Mostra(ArrayList <BoletosXML> Boleto)
		{
			for (int x=0;x<Boleto.size()-1;x++)
			{  
				
			     
			     System.out.println (Boleto.get(x).getNumero());
			     System.out.println(Boleto.get(x).getVcto()); 
			     System.out.println (Boleto.get(x).getValor()); 
			     System.out.println (Boleto.get(x).getCliente()); 
			     System.out.println("");
			    
			    
			 } 
			
		}
		/**
		 * @param Boleto é ArrayList de BoletosXML
		 * @param arq String-local para gravação ex:C:\BoletosXML\boletos.txt
		 * @description Realiza Gravação do arquivo txt no disco 
		 * **/
		public static void GravaArquivo(ArrayList <BoletosXML> Boleto, String arq)
		{
			// acessa arquivo fisico na maquina
			FileWriter arquivo;
			try {
					arquivo = new FileWriter(arq);
					BufferedWriter buffer=new BufferedWriter(arquivo);
					for(int x=0;x<(Boleto.size());x++)
					{					

						String Numero=Boleto.get(x).getNumero();
						String Vcto=Boleto.get(x).getVcto();
						String Valor=Boleto.get(x).getValor();
						String Cliente=Boleto.get(x).getCliente();
						//[telefone removido];07/08/2010;123.78;joao da silva
						buffer.write(Numero+";"+Vcto+";"+Valor+";"+Cliente);
						buffer.newLine();

					}
						
					// fehar buffer para gravar no arquivo // feccha arquivo
					buffer.close();				
					arquivo.close();
				
			     } catch (IOException e){ e.printStackTrace(); }
		}
		 
}
essa é uma Classe Auxiliar  boletoComparator.java

import java.util.Comparator;

public class boletoComparator implements Comparator<BoletosXML>
	 {  
		     public int compare(BoletosXML c1, BoletosXML c2)
		     {  
		         if(c1 == null || c2 == null)  
		            throw new ClassCastException("null");  
		           
		         String  nome1 = c1.getNumero(), nome2 = c2.getNumero();  
		          return nome1.compareTo(nome2);  
		     }  
		 }
Classe BoletosXML.java
/**
 * @author Ismael Ramos Moraes
 * Description Classe que define tipo de boleto
 * */
public class  BoletosXML implements Comparable<BoletosXML>
{
	// atributos(catacteristicas) da classe Boleto
	private String numero;
	private String vcto;
	private String valor;
	private String cliente;
	
		
	// get set da classe
	public void setCliente(String cliente) {
		this.cliente = cliente;
	}
	public String getCliente() {
		return cliente;
	}
	public void setValor(String valor) {
		this.valor = valor;
	}
	public String getValor() {
		return valor;
	}
	public void setVcto(String vcto) {
		this.vcto = vcto;
	}
	public String getVcto() {
		return vcto;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public String getNumero() {
		return numero;
	}
	@Override
	public int compareTo(BoletosXML outro)
	{  
		if(outro == null)  
	    throw new ClassCastException("null");  
	    return this.numero.compareTo(outro.numero);  
	}
	
}
esse é  o xml  de origem dos dados boletos.xml

<?xml version="1.0" encoding="utf-8"?>
<boletos>
    <boleto>
        <numero>[telefone removido]</numero>
        <vcto>02/09/2010</vcto>
        <valor>789.25</valor>
        <cliente>albuquerque, maria</cliente>
    </boleto>
    <boleto>
        <numero>[telefone removido]</numero>
        <vcto>06/07/2010</vcto>
        <valor>237.18</valor>
        <cliente>ferlon, renata alonzo</cliente>
    </boleto>
    <boleto>
        <numero>[telefone removido]</numero>
        <vcto>07/08/2010</vcto>
        <valor>123.78</valor>
        <cliente>silva, joao da</cliente>
    </boleto>
</boletos>
O resultado de tudo isso era gerar esse txt com os boletos ordenados por numeo
boletos.txt
[telefone removido];07/08/2010;123.78;silva, joao da
[telefone removido];02/09/2010;789.25;albuquerque, maria
[telefone removido];06/07/2010;237.18;ferlon, renata alonzo

Valeu galera :slight_smile: Garanti mais alguns pontinhos com o professor.

Criado 29 de agosto de 2010
Ultima resposta 30 de ago. de 2010
Respostas 3
Participantes 3