Trier un array list sur deux champs (arraylist + string[])

Résolu
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010 - 26 sept. 2006 à 17:40
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010 - 27 sept. 2006 à 12:01
bonjour,

j'ai chercher un peu de partout, mais sans reel succes... voici mon cas:
j'ai un array list, dans lequel j'insert un string[6]

j'aimerais pouvoir trier mon arraylist selon les 2 premieres colonnes de mon string.

j'ai entendu parler d'un peu tout, icomparater, icomparable, utiliser une classe plutot qu'un tableau, etc etc, mais je suis pas mal pomé...

j'ai mm essayer la surcharge de sort (creer une class arraylist_perso, qui herite de arraylist), mais je ne sais par quel bout le prendre...

merci de m'apporter un peu d'aide...

14 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
27 sept. 2006 à 10:56
Exemple :

public
class
MyComparer : System.Collections.
IComparer
{
  
public
int Compare(
object o1,
object o2)
   {
     
// Supposons que tu veux trier des chiens pas ordre d'âge :
      if (((
Chien)o1).Age > ((
Chien)o2).Age)
return 1;
     
else
if (((
Chien)o2).Age > ((
Chien)o1).Age)
return -1;
     
else
return 0;
   }
}
Pour faire bien faudrait faire des tests pour être sur que l'object est bien un Chien. Ou encore mieux, tu implémentes IComparer< > au lieu de IComparer.

<hr size="2" />VC# forever
3
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 12:01
et bien franchement, merci infiniement bidou, sans toi, je n'aurais jamais reussi !!!

je donne le code, si besoin pour d'autres personnes comme moi:

arraylist list = new arraylist();
string[] str = new string[3];
string[] str2 = new string[3];
[...] je rempli pli str[0],str[1], etc
list.add(str);
[...] je rempli pli str2[0],str[1], etc
list.add(str2);

IComparer myComparer = new comparAL();
arr.Sort(myComparer);

//class comparAL
using System;
using System.Collections;

    public class comparAL : IComparer
    {
        public int Compare(object o1, object o2)
        {
            int res;
            res = (((string[])o1)[0]).CompareTo(((string[])o2)[0]);
            //apres avoir comparé la 1ere colonne, si elle est à égalité
            //alors on recommence avec la 2eme colonne
            if(res == 0)
            {
                res = (((string[])o1)[1]).CompareTo(((string[])o2)[1]);
            }
            /* //à utiliser si il s'agit d'un tableau de chiffres
            if ( ((string[])o1)[0] > ((string[])o2)[0] ) return 1;
            else if (((string[])o1)[0] < ((string[])o2)[0]) return -1;
            else if (((string[])o1)[1] > ((string[])o2)[1]) return 1;
            else if (((string[])o1)[1] < ((string[])o2)[1]) return -1;
            */
           
            return res;
        }
    }

merci encore bidou
3
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
26 sept. 2006 à 18:10
Si tu utilises une arrayList qui ne contient qu'un type de donnée il vaut mieux utiliser les générics ( pour des raisons de performances et de sécurités pour le programmeur ).
Pour créer ta liste de string procède ainsi :

List<String> list = new List<string>();

Pour ajouter des chaines dedans :
list.Add("chaine");

et pour trier list.Sort() est suffisant. ( je ne vois pas ce que tu entends pas colonne dans un string...)

Mais si tu veux faire ta propre opération de tri il faudra faire list.Sort( ) mais avec un IComparer en argument : je t'invites à consulter la MSDN pour comprendre le fonctionnement c'est très bien expliquer.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
26 sept. 2006 à 22:24
Si tu veux faire un sort cutomizé, il suffit de créer une class qui implémenter IComparer et d'implémenter sa méthode public int Compare(object o1, object 02).
Tu peux aussi utiliser IComparer< >.

<hr size="2" />VC# forever
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 09:12
merci, je vais essayer de me debrouiller avec ce que vous me dite.

moddib> par tableau de string, j'entend ca: string[] var = new string[6];
ton idée List<String> list = new List<string>();
             list.Add("chaine");
ca ne me vas pas du tout, car j'ai besoin de stocker 6 colonnes ... à moins que tu me donne 1 tableau 2dimensions dynamique...

bidou >merci c'est à peu pres ce que je veux, mais comme je l'ai signalé, j'ai déjà vu tt ca, mais je capte pas comment l'utilisé.., je vais essayer, dit moi si je suis sur la bonne voie:

arraylist2 list = new arraylist2();
string[] str = new string[3];
[...] je rempli pli str[0],str[1], etc
list.add(str);
[...]
list.add(str);


ensuite je creer une classe arraylist2 qui hérite de arraylist

public int compare(object o1,object o2)
{
    if(o1[0] < o2[0])
    {
        return -1;
     }else{
          if(o1[0] > o2[0])
           {
               return 1;
             }
    }
        return 0;
}
(apres pour trier sur deux colonnes, je complique les conditions...)

merci,d'avance
0
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 09:14
correction :
public int Comparer(object o1,object o2)
0
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 09:25
finalement, c'est pas ca du tout, quand je fait lst.sort()

il ne rentre ni dans compare, ni mm comparer ...
snif ;_;

par contre, ca compil pas, il faut que je mette:
public int compare(string[] o1,string[] o2)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
27 sept. 2006 à 09:52
Tu n'as pas bien compris comment ça marche apparement ;-)
La méthode Sort prend un IComparer en argument, donc tu peux faire qqch comme ça :

public class MyComparer : Comparer
{
   public int Compare(object o1, object o2)
  {
     // ici tu retournes 1, 0 ou -1 selon les critères que tu veux
  }
}

Ensuite, tu fais myList.Sort(new MyComparer());

<hr size="2" />VC# forever
0
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 10:13
bidou>

Tu n'as pas bien compris comment ça marche apparement ;-) => exactement, d'où mon post ^^

j'ai essayer avec ton dernier post, mais c'est pas gagné, voici ce que j'ai fait

using System;
using System.Collections;

    public class ComparAL : Comparer
    {
        public ComparAL() {}
        public int Compare(object o1, object o2)
        {
            int res;
            res = o1[0].CompareTo(o2[0]);
            if(res == 0)
            {
                res = o1[1].CompareTo(o2[1]);
            }
            return res;
        }
    }
mais a la compil il me dit:
 'maj_structure.ComparAL' : cannot inherit from sealed class 'System.Collections.Comparer'

et puis je sais pas si je doit mettre:
        public int Compare(object o1, object o2)
ou
        public int Compare(object[] o1, object[] o2)
ou
        public int Compare(string[] o1, string[] o2)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
27 sept. 2006 à 10:21
J'ai mal tapé dans mon premier exemple :

public class MyComparer : IComparer
{
   public int Compare(object o1, object o2)
  {
     // ici tu retournes 1, 0 ou -1 selon les critères que tu veux
  }
}

<hr size="2" />VC# forever
0
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 10:30
j'avais essayer, mais je pensais que c'était faux, car je tombe sur cette erreur:

 'maj_structure.ComparAL' does not implement interface member 'System.Collections.IComparer.Compare(object, object)'

à cause de:
public class ComparAL : Comparer
0
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 10:36
oups moi aussi faute de frappe
je voulais dire
public class ComparAL : IComparer
0
enigmatiqk Messages postés 39 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 9 mars 2010
27 sept. 2006 à 11:15
ben écoute, jme suis pri la tete car ca ne marchai pas, alors au final, j'ai supprimer la class, et j'en ai refaite une nouvelle, et la ca marche.

par contre, j'ai tjr le mm pb:

je sais pas si je doit mettre:
        public int Compare(object o1, object o2)
ou
        public int Compare(object[] o1, object[] o2)
ou
        public int Compare(string[] o1, string[] o2)

ne pas oublier ce que je compare:
arraylist list = new arraylist();
string[] str = new string[3];
[...] je rempli pli str[0],str[1], etc
list.add(str);
[...] je rempli pli str[0],str[1], etc
list.add(str);
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
27 sept. 2006 à 11:26
Tu copies exactement ce que je t'ai donné en remplacant la class Chien pas string[]

<hr size="2" />VC# forever
0