Ordenacao - Comparable

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.

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.

Valeu entanglement, funcionou perfeito…

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.

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! :smiley: