2009-10-03 7 views
2

je dois trier une liste d'achats par l'allée se trouve l'élément, par exemple:
[Pain] [1]
[lait] [2]
[céréales] [3]Java 2D ArrayList et le tri

Je prévois de le faire avec ArrayList et je me demandais comment faire un 2D ArrayList Questions supplémentaires: des idées sur la façon de trier par le numéro de l'allée?

Répondre

5

N'avez-vous pas une classe qui contient votre information item + allée? Quelque chose comme:

public class Item { 
    private String name; 
    private int aisle; 

    // constructor + getters + setters 
} 

Si vous ne pas envisager de faire un - il est sans aucun doute une meilleure approche que d'essayer de coller ces attributs dans ArrayList dans une autre ArrayList. Une fois que vous avez dit classe, vous aurez soit besoin d'écrire un Comparator pour vos objets ou faire « objet » Comparable par lui-même:

public class Item implements Comparable<Item> { 
    .. same stuff as above... 

    public int compareTo(Item other) { 
    return this.getAisle() - other.getAisle(); 
    } 
} 

Alors tout ce que vous faites Invoke genre:

List<Item> items = new ArrayList<Item>(); 
... populate the list ... 
Collections.sort(items); 
+0

bien je vais regarder dans ce – Raptrex

+0

devrais-je faire plusieurs objets ou quelque chose, parce que la raison pour laquelle j'ai pensé à utiliser un ArrayList était parce que je ne sais pas combien d'éléments il y aurait – Raptrex

+0

Vous devrez créer plusieurs objets instances, oui, et ajoutez-les à ArrayList. 'items.add (nouvel item (" Pain ", 1)); items.add (nouvel item ("Lait", 2)); ', etc ... – ChssPly76

0

Si vous souhaitez trier une ArrayList de ArrayLists, vous pouvez utiliser le ColumnComparator.

Si vous souhaitez trier une ArrayList de votre objet personnalisé, vous pouvez utiliser le BeanComparator.

0

Je sais que la question a été posée il y a longtemps mais en fait j'ai eu le même problème. Si vous ne savez pas combien de variables vous auriez sur la liste, mais ce n'est pas un grand nombre, vous pouvez simplement mettre en œuvre un comparateur pour chaque choix. par exemple

Je ArrayList<ArrayList<Object>> et à trier par de colonne et je sais que la liste imbriquée se composent de nombre variable d'objets que je peux simplement mettre en œuvre comparateur pour toutes les valeurs possibles:

public class SecondColumnComparator implements Comparator { 

public static boolean isNumeric(String str) { 
    try { 
     Integer integer = Integer.parseInt(str); 
    } catch (NumberFormatException nfe) { 
     return false; 
    } 
    return true; 
} 

@Override 
public int compare(Object o1, Object o2) { 

    if (isNumeric(((ArrayList<String>) o1).get(1))) { 

     Integer firstInteger = Integer.parseInt(((ArrayList<String>) o1).get(1)); 
     Integer secondInteger = Integer.parseInt(((ArrayList<String>) o2).get(1)); 

     return firstInteger.compareTo(secondInteger); 

    } 
    if (((ArrayList<Object>) o1).get(1) instanceof String) { 

     String firstString = ((ArrayList<String>) o1).get(1); 
     String secondString = ((ArrayList<String>) o2).get(1); 

     return firstString.compareTo(secondString); 
    } 

    throw new Exception(); 
} 

}

et appeler cela ainsi:

 switch (valueSelected) { 
     case 0: 
      Collections.sort(this.listOfLists, new FirstColumnComparator()); 
      break; 
     case 1: 
      Collections.sort(this.listOfLists, new SecondColumnComparator()); 
      break; 
     case 2: 
      Collections.sort(this.listOfLists, new ThirdColumnComparator()); 
      break; 
     case 3: 
      Collections.sort(this.listOfLists, new FourthColumnComparator()); 
      break; 
     default: 

    } 

Dans chaque comparateur modifiant juste .get(x) où x est le nombre de collumn par que vous voulez trier.

La fonction boolean isNumeric(String str); peut être utilisée parce que vous ne pouvez pas stocker différents types d'objets dans une liste, donc je mets la reconnaissance de ceci dans le comparateur et j'analyse String en un autre type. Rappelez-vous que ce comparator et ses "calculs" sont appelés à chaque comparaison faite par un algorithme donc il est extrêmement inefficace ... En dépit de ce fait, c'est une sorte de solution.

Questions connexes