2016-01-20 2 views
0

J'ai une liste de tableau qui contient les éléments suivants:méthode Java compareTo ne fonctionne pas comme prévu

{a2.name, a4.name, tr.prod_date, a3.name, a1.name, a5.name, a6.name, a7.name, a8.name, a9.name, a10.name} 

Dans ma méthode - je suis en train de comparer les champs et les trier afin qu'ils reviendront dans l'ordre alphabétique.

 Collections.sort(dataJSON, new Comparator() { 
     public int compare(Object obj1, Object obj2) { 
      return ((ReportDetail) obj1).getReportColumn().compareTo(((ReportDetail) obj2).getReportColumn()); 
     } 
    }); 

Malheureusement, les résultats que je vois est que a10.name viendra devant a2.name - suis-je manque quelque chose ou est-il une autre approche que je devrais prendre?

+0

je reçois qu'il ne regarde pas a10 a un seul numéro et il est en train de prendre le premier chiffre, mais est-il un moyen pour qu'il compare la chaîne complète je suppose – Buccaneer

+1

Il est trié lexicalement. Vous pouvez implémenter 'compareTo' pour extraire le nombre et le trier si le reste de la chaîne est identique. – Atri

Répondre

0

Vous pouvez faire une coutume Comparator comme ReportComparator implements Comparator<ReportDetail>

Puis ajouter

public int compare(ReportDetail r1, ReportDetail r2) { 
      return Long.valueOf(r1.getReportColumn.subString(1,r1.getReport().length() - 1) -Long.valueOf(r2.getReportColumn.subString(1,r2.getReport().length() - 1); 
     } 
1

Il effectue une comparaison de chaînes car vous n'avez pas fourni votre propre méthode de comparaison. Pour cette raison, vous voyez une comparaison de caractère par caractère. Cela signifie que 'a' == 'a', '1' < '2' donc il tombe et les trie dans l'ordre de votre vision. vous aurez besoin de vous écrire propre comparer.