[RESOLVIDO]ordenação personalizada de list de String

6 respostas
S

Olá pessoal. Minha dúvida é a seguinte: Tenho uma lista de String (primeiro crio um vetor String [] , e depois uso o método Arrays.asList para transformar em lista), e quero fazer a ordenação dessa lista conforme uma posição N desse vetor, e pela ordem que eu escolha, não em ordem alfabética. O código da UF fica nas posições 17 e 18, e eu quero ordenar da seguinte maneira: 1 - RS, 2 - SC, 3 - PR, 4 - SP, 5 - outros estados. Alguém pode me dar uma luz? Obrigado!!

6 Respostas

ViniGodoy

Implemente seu próprio Comparator:

S

Opa, desculpe a ignorancia, mas ainda nao consegui implementar.. sei como ordenar por ordem alfabética por exemplo, mas nao consegui implementar meu problema. Segue o código:

public class Teste {
    String[] lista = {"SALVADOR -       BA",
        "SAO PAULO -      SP",
        "PORTO ALEGRE -   RS",
        "RIO DE JANEIRO - RJ",
        "FLORIANOPOLIS -  SC",
        "CURITIBA -       PR"
    };

    public void ordenaLista() {
        List<String> listaOrdenada = Arrays.asList(this.lista);
        Collections.sort(listaOrdenada, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                String s = Character.toString(s1.charAt(17))
                        + Character.toString(s1.charAt(18));
        //aqui a lógica que nao estou conseguindo
                return 0;
        });
        for (String s : listaOrdenada) {
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        Teste t = new Teste();
        t.ordenaLista();
    }
}
ribclauport

Se eu entendi você quer ordenar pela sigla da cidade, certo?

Se for isso segue abaixo o "ajuste"

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Teste {  
    String[] lista = {"SALVADOR -       BA",  
        "SAO PAULO -      SP",  
        "PORTO ALEGRE -   RS",  
        "RIO DE JANEIRO - RJ",  
        "FLORIANOPOLIS -  SC",  
        "CURITIBA -       PR"  
    };  

    public void ordenaLista() {  
        List<String> listaOrdenada = Arrays.asList(this.lista);  
        Collections.sort(listaOrdenada, new Comparator<String>() {  
            @Override  
            public int compare(String s1, String s2) {  
            	return  s1.substring(17, 19).compareTo(s2.substring(17,19));
            }
        });  
        for (String s : listaOrdenada) {  
            System.out.println(s);  
        }  
    }  

    public static void main(String[] args) {  
        Teste t = new Teste();  
        t.ordenaLista();  
    }  
}
S
ribclauport:
Se eu entendi você quer ordenar pela sigla da cidade, certo?

Se for isso segue abaixo o "ajuste"

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Teste {  
    String[] lista = {"SALVADOR -       BA",  
        "SAO PAULO -      SP",  
        "PORTO ALEGRE -   RS",  
        "RIO DE JANEIRO - RJ",  
        "FLORIANOPOLIS -  SC",  
        "CURITIBA -       PR"  
    };  

    public void ordenaLista() {  
        List<String> listaOrdenada = Arrays.asList(this.lista);  
        Collections.sort(listaOrdenada, new Comparator<String>() {  
            @Override  
            public int compare(String s1, String s2) {  
            	return  s1.substring(17, 19).compareTo(s2.substring(17,19));
            }
        });  
        for (String s : listaOrdenada) {  
            System.out.println(s);  
        }  
    }  

    public static void main(String[] args) {  
        Teste t = new Teste();  
        t.ordenaLista();  
    }  
}

Dessa maneira irá ordenar por ordem alfabética, nao é assim que eu preciso.. eu quero por uma ordem personalizada: primeiro RS, depois, SC, depois PR, depois SP, depois RJ e depois BA..

ribclauport

Porém a sua personalização, não tem uma regra que a torne constante, isso que você esta dizendo deve então ser manipulada por um arrayList, sendo definida pelo indíce desta forma você insere no indice que desejar:

Pois imagine um compareTo implementado com vários ifs ou sei lá tipo if(string.equals("RS") return -1, ou return 0, não haverá lógica pensou eu
em implementar um Comparable para isso eu faria assim:

String[] lista = {"SALVADOR -       BA",    
    		        "SAO PAULO -      SP",    
    		        "PORTO ALEGRE -   RS",    
    		        "RIO DE JANEIRO - RJ",    
    		        "FLORIANOPOLIS -  SC",    
    		        "CURITIBA -       PR"    
    		    };  
    	 //1 - RS, 2 - SC, 3 - PR, 4 - SP, 5
    	List&lt;String&gt; listaList = new ArrayList&lt;String&gt;();
    	listaList.add(0,lista[2]);
    	listaList.add(0,lista[4]);
    	listaList.add(0,lista[5]);
    	listaList.add(0,lista[1]);
    	
    	for(String x : listaList){
    		System.out.println(x);
    	}
S

Consegui, da seguinte maneira:

import java.util.Arrays;  
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
  
public class Teste {    
    String[] lista = {"SALVADOR -       BA",    
        "SAO PAULO -      SP",    
        "PORTO ALEGRE -   RS",    
        "RIO DE JANEIRO - RJ",    
        "FLORIANOPOLIS -  SC",    
        "CURITIBA -       PR"    
    };    
    public void ordenaLista() {    
        List<String> listaOrdenada = Arrays.asList(this.lista);    
        Collections.sort(listaOrdenada, new Comparator<String>() {    
            @Override    
            public int compare(String s1, String s2) {    
                String [] ordem = {"RS", "SC", "PR", "SP", "RJ", "BA"};
                List <String> ordemList = Arrays.asList(ordem);
                String uf1 =  s1.substring(17, 19);  
                String uf2 = s2.substring(17, 19);  
                int i1 = ordemList.indexOf(uf1);
                int i2 = ordemList.indexOf(uf2);
                return i1-i2;
            }  
        });    
        for (String s : listaOrdenada) {    
            System.out.println(s);    
        }    
    }    
  
    public static void main(String[] args) {    
        Teste t = new Teste();    
        t.ordenaLista();    
    }    
}

Obrigado pela ajuda pessoal!

Criado 21 de fevereiro de 2012
Ultima resposta 23 de fev. de 2012
Respostas 6
Participantes 3