2010-07-16 5 views
2

J'ai un ArrayList que j'ai besoin de trier et j'ai aussi besoin d'un élément par défaut spécifique pour être au sommet de la liste. Je peux le faire moi-même en vérifiant la liste de tableau, en supprimant l'élément par défaut et en l'insérant en haut de la liste.Comment amener un élément au sommet de ArrayList dans java

Fondamentalement, la liste devrait avoir une valeur par défaut sur le haut et les valeurs restantes dans l'ordre trié. Y a-t-il une méthode API existante qui le fait?

Répondre

7

Je venais d'écrire une méthode qui a fait ce que vous décrivez ... quelque chose comme:

public static <T> void sortWithDefault(final List<T> list) 
{ 
    Collections.sort(list); 
    // remove the default item 
    // insert the default item at the start of the list 
} 

Vous pouvez également utiliser un comparateur (il serait moins évident si) où il se compare toujours article par défaut comme le plus bas dans toute comparaison et la comparaison naturelle pour le reste des articles. Pour cela, vous appelez Collections.sort (Liste, Comparateur);

Voici un code pour un tel comparateur ... encore une fois. Je ne l'aime pas vraiment, car il est pas évident ... mais il est une solution raisonnable, je suppose:

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

public class Main 
{ 
    public static void main(final String[] argv) 
    { 
     final List<Integer> list; 

     list = new ArrayList<Integer>(); 

     for(int i = 10; i > 0; i--) 
     { 
      list.add(i); 
     } 

     Collections.sort(list, new DefaultAtStartComparator<Integer>(5)); 

     System.out.println(list); 
    } 
} 

class DefaultAtStartComparator<T extends Comparable> 
    implements Comparator<T> 
{ 
    private final T defaultValue; 

    public DefaultAtStartComparator(final T value) 
    { 
     defaultValue = value; 
    } 

    public int compare(final T a, 
         final T b) 
    { 
     if(a.equals(defaultValue)) 
     { 
      return (-1); 
     } 

     if(b.equals(defaultValue)) 
     { 
      return (1); 
     } 

     return (a.compareTo(b)); 
    } 
} 
+0

Je préférerais la première solution seulement puisque la deuxième semble un peu étrange, nous attendons généralement un comparateur pour trier seulement. Merci TofuBeer. – Reddy

4

Pas que je sache. Vous pourriez devoir faire quelque chose manuellement comme vous l'avez dit ... par exemple.

List<T> list = new ArrayList<T>(); 
// Insert items into list 
... 

Collections.sort(list); 

T defaultValue = null; 
for (int i = 0; i < list.size(); i++) { 
    T value = list.get(i); 
    if (isDefaultValue(defaultValue)) {   
     defaultValue = list.remove(i); 
    }   
} 

if (defaultValue != null) { 
    list.add(0, defaultValue); 
} 
5
ArrayList.add(int index,E element) 

Inserts l'élément-spécifié (E) à la position spécifiée (index) dans cette liste. Décale l'élément actuellement à cette position (le cas échéant) et tous les éléments suivants à droite (ajoute un à leurs indices).

index peut être défini sur 0 si vous devez placer l'élément en haut de la liste.