2010-10-25 4 views
4

J'ai un Class1tri Liste <Class> par un de ses variables

public class Class1 { 
    public Class(String s, int[] s1, int soc) { 
     this.s = s; 
     this.s1 = s1; 
     this.soc = soc 
    } 
} 

J'ai un List de Class1 (List<Class1>). Je veux trier cette liste par soc, pour obtenir le Class1 avec le plus soc premier

+0

Avez-vous des stipulations? A-t-il besoin d'être une méthode récursive ou quelque chose de très efficace (par exemple, quicksort)? Ou cherchez-vous une implémentation facile/simple. Vous pourriez finalement utiliser une boucle for(), cependant, il serait très difficile pour l'ordinateur de le faire si vous avez une liste de, disons, 100 000 éléments. – RageD

+0

duplication possible de [trier une liste du plus élevé au plus bas] (http://stackoverflow.com/questions/4017728/sort-a-listtuple-from-highest-to-lowest) –

+0

Pas un dup ... s'il demandé là il aurait changé sa question originale dans un autre. – TofuBeer

Répondre

13

Utilisez un comparateur

Collections.sort(list, new Comparator<Class1>() { 
    public int compare(Class1 c1, Class1 c2) { 
    if (c1.soc > c2.soc) return -1; 
    if (c1.soc < c2.soc) return 1; 
    return 0; 
    }}); 

(Notez que la comparaison méthode renvoie -1 pour « premier argument vient en premier dans la liste triée ", 0 pour" ils sont également classés "et 1 pour le" premier argument vient deuxième dans la liste triée ", et la liste est modifiée par la méthode de tri)

+4

Ne fonctionnera pas si un objet Class1 a soc = Integer.MIN_VALUE par exemple. – aioobe

+0

Bon point - Je l'ai corrigé –

+1

Code fixé maintenant. La version précédente (return c2.soc - c1.soc) avait quelques cas où cela ne fonctionnerait pas, par exemple si c2.soc est 2,000,000,000 et c1.soc est -1,000,000,000. "Presque toutes les recherches binaires et Mergesorts sont cassés" - http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html –

0

Créer une classe qui implémente Comparator, créer votre personnalisé méthode de tri, puis passez une instance de cette classe dans cette fonction: Collections.sort

+0

Exemple: Ajouter des getters et setters et vous pouvez utiliser 'this.list.sort (Comparator.comparing (Class1 :: getSoc));' – Christian

1

Voici un exemple complet:

import java.util.*; 

class Class1 { 
    String s; 
    int[] s1; 
    int soc; 

    public Class1(String s, int[] s1, int soc) { 
     this.s = s; 
     this.s1 = s1; 
     this.soc = soc; 
    } 

    public String toString() { return String.format("s: %s soc: %d", s, soc); } 
} 

public class Test { 
    public static void main(String... args) { 
     List<Class1> list = new ArrayList<Class1>(); 
     list.add(new Class1("abcd", new int[] {1}, 3)); 
     list.add(new Class1("efgh", new int[] {2}, 5)); 
     list.add(new Class1("ijkl", new int[] {8}, 9)); 
     list.add(new Class1("mnop", new int[] {3}, 7)); 

     Collections.sort(list, new Comparator<Class1>() { 
      public int compare(Class1 o1, Class1 o2) { 
       return o1.soc > o2.soc ? -1 : o1.soc == o2.soc ? 0 : 1; 
      } 
     }); 

     System.out.println(list.toString().replaceAll(",", "\n")); 
    } 
} 

Il imprime les éléments suivants:

[s: ijkl soc: 9 
s: mnop soc: 7 
s: efgh soc: 5 
s: abcd soc: 3] 
+0

Est-ce que 's',' s1', 'soc', doit vraiment être un accès par défaut au lieu de privé? –

+0

Si elles sont privées, elles doivent avoir des méthodes d'accès pour que le comparateur puisse faire son travail (sauf si Class1 est implémenté Comparable et si vous ne spécifiez pas de Comparateur) –

+0

Great !! Merci beaucoup – y2p

0

Alors que la réponse de Scott Stanchfield est généralement la meilleure façon de le faire en Java actuellement, si vous avez d'autres choses fonctionnelles que vous pourriez vouloir faire avec les propriétés de votre classe, il peut être utile de faire usage de Function s Guava s.

public class Class1 { 
    ... 
    public static final Function<Class1, Integer> GET_SOC = 
     new Function<Class1, Integer>() { 
     public Integer apply(Class1 input) { 
      return input.soc; 
     } 
     }; 
    ... 
} 

Ensuite, vous pouvez utiliser pour trier sa classe Ordering:

List<Class1> list = ...; 
Collections.sort(list, Ordering.natural().reverse().onResultOf(Class1.GET_SOC)); 

Il utilise l'inverse de l'ordre naturel basé sur la propriété soc de chaque Class1 instance pour donner l'ordre que vous voulez.