Duvida como atualizar um list com informação de um metodo e ordenar?

Olá,

estou a seguinte problema conforme abaixo :

  1. ler um dao com informações do banco
  2. atualizar uma lista com uma informação que vem de um framework de fora
  3. Ordenar a lista por esse campo novo do item 2 (essa é minha duvida como ordenar a list por esse campo pois
    no select não tem esse campo)

alguém poderia me ajudar e se o que fiz abaixo está certo ou tem outro jeito ???

abs


public class TestDb1 {

	
	private String nome;
	private String sobreNome;
	private String login;
	public TestDb1 (String nome,String sobreNome,String login){
		this.nome = nome;
		this.sobreNome= sobreNome;
		this.login =login;
	}
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSobreNome() {
		return sobreNome;
	}

	public void setSobreNome(String sobreNome) {
		this.sobreNome = sobreNome;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("passo 1");
		List<TestDb1> listas = new ArrayList<TestDb1>();
		
		//essa lista iria no banco de dados buscar as informações
		listas.add(new TestDb1("Meu","Nome",null));
		listas.add(new TestDb1("Fulano","Tal",null));
		listas.add(new TestDb1("LG","Video",null));
		System.out.println("passo 2");
		//só que falta o campo login que está em um metodo de um framework

		List<TestDb1> listas1 = new ArrayList<TestDb1>();
		
//ler a lista do banco e cria outra lista com a informação do framework
		
		for (TestDb1 object : listas) {
			
			System.out.println("Nome="+object.getNome());
			System.out.println("SobreNome="+object.getSobreNome());
			System.out.println("Login="+object.getLogin());
			System.out.println("====================================");
            // passo o nome pro metodo e me retorna uma String
			listas1.add(new TestDb1(object.getNome(),object.sobreNome,getLogin(object.getNome())));
		}
		
//queria que saisse ordenado por login tem jeito ?????
		
		for (TestDb1 testDb1 : listas1) {
			System.out.println("Nome="+testDb1.getNome());
			System.out.println("SobreNome="+testDb1.getSobreNome());
			System.out.println("Login="+testDb1.getLogin());
			System.out.println("+++++++++++++++++++++++++++++");
		}
		
	}

	// simulando do framework
	public static String getLogin(String login){
		return "login";
	}


}

Segue uma maneira de ordenar uma lista por ordem alfabética.

Crie uma classe para comparação que implemente a interface Comparator, e use o método Collections.sort(List list, Comparator c).

public class ComparaTeste implements Comparator<String> {

    //no caso, a classe String ja tem um metodo que se comporta
    //como desejado para a implementacao do compare()
    public int compare(String umTeste, String outroTeste) {
        return umTeste.compareTo(outroTeste);
    }
    
    public static void main(String[] args) {
    	ArrayList<String> lista = new ArrayList<String>();
    	lista.add("ccc");
    	lista.add("aaa");
    	lista.add("bbb");
    	lista.add("zzz");
    	lista.add("xxx");
    	
        //Faz o trabalho sujo para voce
    	Collections.sort(lista, new ComparaTeste());
    	
    	for (String s : lista) { 
    		System.out.println(s);
    		//saida:
    		//aaa
    		//bbb
    		//ccc
    		//xxx
    		//zzz
    	}
    }
}

tentei usar o exemplo e me deu erro :



na linha 

Collections.sort(listas1, new ComparaTeste());  

erro:

he method sort(List&lt;T&gt;, Comparator&lt;? super T&gt;) in the type Collections is not applicable for the arguments 
 (List&lt;TestDb1&gt;, ComparaTeste)

package br.com.comparator;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

 public class TestDb1 {  
	          
	        private String nome;  
	        private String sobreNome;  
	        private String login;  
	       public TestDb1 (String nome,String sobreNome,String login){  
	            this.nome = nome;  
	            this.sobreNome= sobreNome;  
	           this.login =login;  
	      }  
	      public String getNome() {  
	           return nome;  
	       }  
	     
	       public void setNome(String nome) {  
	           this.nome = nome;  
	       }  
	     
	       public String getSobreNome() {  
	           return sobreNome;  
	       }  
	     
	       public void setSobreNome(String sobreNome) {  
	           this.sobreNome = sobreNome;  
	       }  
	     
	       public String getLogin() {  
	           return login;  
	       }  
	     
	       public void setLogin(String login) {  
	           this.login = login;  
	       }  
	     
	       /** 
	        * @param args 
	        */  
	       public static void main(String[] args) {  
	           // TODO Auto-generated method stub  
	           System.out.println("passo 1");  
	           List&lt;TestDb1&gt; listas = new ArrayList&lt;TestDb1&gt;();  
	             
	           //essa lista iria no banco de dados buscar as informações  
	           listas.add(new TestDb1("Meu","Nome",null));  
	           listas.add(new TestDb1("Fulano","Tal",null));  
	           listas.add(new TestDb1("LG","Video",null));  
	           System.out.println("passo 2");  
	           //só que falta o campo login que está em um metodo de um framework  
	     
	           List&lt;TestDb1&gt; listas1 = new ArrayList&lt;TestDb1&gt;();  
	             
	   //ler a lista do banco e cria outra lista com a informação do framework  
	             
	           for (TestDb1 object : listas) {  
	                 
	               System.out.println("Nome="+object.getNome());  
	               System.out.println("SobreNome="+object.getSobreNome());  
	               System.out.println("Login="+object.getLogin());  
	               System.out.println("====================================");  
	               // passo o nome pro metodo e me retorna uma String  
	               listas1.add(new TestDb1(object.getNome(),object.sobreNome,getLogin(object.getNome())));  
	           }  
	             
	   //queria que saisse ordenado por login tem jeito ?????  
	         //Faz o trabalho sujo para voce  
	           Collections.sort(listas1, new ComparaTeste());  ?????


	           for (TestDb1 testDb1 : listas1) {  
	               System.out.println("Nome="+testDb1.getNome());  
	               System.out.println("SobreNome="+testDb1.getSobreNome());  
	               System.out.println("Login="+testDb1.getLogin());  
	               System.out.println("+++++++++++++++++++++++++++++");  
	           }  
	             
	       }  
	     
	       // simulando do framework  
	       public static String getLogin(String login){  
	           return "login";  
	       }  
	     
	     
	   }  

--------------------
public class ComparaTeste implements Comparator&lt;String&gt; {  
	      
	      //no caso, a classe String ja tem um metodo que se comporta  
	        //como desejado para a implementacao do compare()  
	        public int compare(String umTeste, String outroTeste) {  
	            return umTeste.compareTo(outroTeste);  
	        }  
	          
	        public static void main(String[] args) {  
	           ArrayList&lt;String&gt; lista = new ArrayList&lt;String&gt;();  
	           lista.add("ccc");  
	           lista.add("aaa");  
	           lista.add("bbb");  
	           lista.add("zzz");  
	           lista.add("xxx");  
	             
	           //Faz o trabalho sujo para voce  
	           Collections.sort(lista, new ComparaTeste());  
	             
	           for (String s : lista) {   
	               System.out.println(s);  
	               //saida:  
	               //aaa  
	               //bbb  
	               //ccc  
	               //xxx  
	               //zzz  
	           }  
	       }  
	   }  

[quote=paribe]tentei usar o exemplo e me deu erro :


na linha 

Collections.sort(listas1, new ComparaTeste());  

erro:

he method sort(List&lt;T&gt;, Comparator&lt;? super T&gt;) in the type Collections is not applicable for the arguments 
 (List&lt;TestDb1&gt;, ComparaTeste)

[/quote]

Ah sim, é porque a sua classe do ComparatorTeste precisa implementar a interface Comparator especificando que será usada para comparar objetos da classe TesteDb1.

public class ComparaTeste implements Comparator&lt;TesteDb1&gt; { 
    public int compare(TesteDb1 umTeste, TesteDb1 outroTeste) {
        //implemente  aqui a logica para comparacao dos objetos TesteDb1
    }
}

obrigado deu certo …



			public int compare(TestDb1 umTeste, TestDb1 outroTeste) {
				// TODO Auto-generated method stub
				//return 0;
				return umTeste.getLogin().compareTo(outroTeste.getLogin()); 
			}

mais uma duvida se precisar com dois campos por exemplo login e nome

como poderia fazer o comparator com dois campos ???

# public int compare(TestDb1 umTeste, TestDb1 outroTeste) {  
#     // TODO Auto-generated method stub  
#     //return 0;  
#     return umTeste.getLogin().compareTo(outroTeste.getLogin());   

O seu método compare() é você quem implementa, então você pode colocar o que quiser lá dentro, não necessariamente o compareTo entre duas Strings.

Agora, se o getLogin e getNome ambos retornam Strings, e se você quiser fazer a comparação lexicográfica, continue usando o compareTo.

[]s
–mcbrain