vdb
Janeiro 6, 2010, 11:38am
#1
Pessoal estou precisando fazer uma ordenacao de um campo id (String), provavelmente terei que implementar Comparable, na real até já fiz isso, mas não consegui efetuar a ordenacao corretamente.
Segue um exemplo do que preciso fazer.
Dados que tenho no campo ID
1
1.1
1.1.1
2
2.1
2.2
2.3
…
2.9
2.10
2.10.1
2.11
Se mando ordenar pelo campo ID, a ordem vem 2.1, 2.10, 2.10.1, 2.11, 2.2, etc…
Minha ideia foi executar um split separando os numeros, assim conseguiria comparar numero a numero, mas nao tive muito sucesso. O resultado foi este.
[1, 1.1, 1.1.1, 1.2, 1.4, 2, 2.1, 2.2, 2.3, 2.3.1, 2.3.2, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10, 2.11, 4, 4.1, 2.10.1]
Quase funcionou mas nao sei por qual motivo o 2.10.1 esta por ultimo.
xjunior
Janeiro 6, 2010, 11:49am
#2
Brother, procura saber sobre ordenação natural, ok?
Sua ideia deve ter sido parcialmente implementada. Eu a implementaria assim (testei e funcionou):
import java.util.*;
class ComparatorItens implements Comparator<String> {
private int compareIntArrays (int[] a1, int[] a2) {
int minLength = Math.min (a1.length, a2.length);
for (int i = 0; i < minLength; ++i) {
if (a1[i] < a2[i])
return -1;
if (a1[i] > a2[i])
return +1;
}
if (a1.length < a2.length)
return -1;
if (a1.length > a2.length)
return +1;
return 0;
}
public int compare (String s1, String s2) {
String[] str1 = s1.split ("\\.");
String[] str2 = s2.split ("\\.");
int[] int1 = new int[str1.length];
int[] int2 = new int[str2.length];
for (int i = 0; i < int1.length; ++i) { int1[i] = Integer.parseInt (str1[i]); }
for (int i = 0; i < int2.length; ++i) { int2[i] = Integer.parseInt (str2[i]); }
return compareIntArrays (int1, int2);
}
}
class ComparacaoItens {
public static void main (String[] args) {
String[] itens = {"1", "1.1", "1.1.1", "1.2", "1.4", "2", "2.1", "2.2", "2.3", "2.3.1", "2.3.2", "2.4", "2.5", "2.6", "2.7", "2.8",
"2.9", "2.10", "2.11", "4", "4.1", "2.10.1" };
Arrays.sort (itens, new ComparatorItens());
System.out.println (Arrays.asList (itens));
}
}
Como está o seu Comparable? Poste aqui.
vdb
Janeiro 6, 2010, 2:05pm
#5
Valeu entanglement, funcionou perfeito…
Marck
Janeiro 7, 2010, 7:06pm
#6
Olá!
As string já implementam o Comparable.
Dá pra fazer assim:
List<String> al = new ArrayList<String>();
al.add("1.25.25");
al.add("1.26.40");
al.add("3.00.5");
al.add("4.25.25");
al.add("0.25.25");
Collections.sort(al);
System.out.println(al);
…como o xjunior falou.
tem de ser como o entlanglement falou (alias, parabens por ter escrito o codigo), pois se ordernar por String, 2.10 vai vir antes de 2.5 por exemplo.
Marck
Janeiro 7, 2010, 11:43pm
#8
Você tem razão. Para o que ele quer pode não servir. Acontece que, em decimal 2.10 é < 2.5 e parece que é isso que o Comparator faz…
Agora se fosse 2.10 e 2.05 funcionaria!