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

enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 26 sept. 2006 à 17:40 - Dernière réponse : enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention
- 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...
Afficher la suite 

14 réponses

Répondre au sujet
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 27 sept. 2006 à 10:56
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 12:01
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de enigmatiqk
MoDDiB 546 Messages postés mardi 26 novembre 2002Date d'inscription 4 mai 2007 Dernière intervention - 26 sept. 2006 à 18:10
0
Utile
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.
Commenter la réponse de MoDDiB
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 26 sept. 2006 à 22:24
0
Utile
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
Commenter la réponse de cs_Bidou
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 09:12
0
Utile
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
Commenter la réponse de enigmatiqk
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 09:14
0
Utile
correction :
public int Comparer(object o1,object o2)
Commenter la réponse de enigmatiqk
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 09:25
0
Utile
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)
Commenter la réponse de enigmatiqk
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 27 sept. 2006 à 09:52
0
Utile
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
Commenter la réponse de cs_Bidou
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 10:13
0
Utile
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)
Commenter la réponse de enigmatiqk
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 27 sept. 2006 à 10:21
0
Utile
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
Commenter la réponse de cs_Bidou
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 10:30
0
Utile
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
Commenter la réponse de enigmatiqk
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 10:36
0
Utile
oups moi aussi faute de frappe
je voulais dire
public class ComparAL : IComparer
Commenter la réponse de enigmatiqk
enigmatiqk 40 Messages postés mercredi 18 juin 2003Date d'inscription 9 mars 2010 Dernière intervention - 27 sept. 2006 à 11:15
0
Utile
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);
Commenter la réponse de enigmatiqk
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 27 sept. 2006 à 11:26
0
Utile
Tu copies exactement ce que je t'ai donné en remplacant la class Chien pas string[]

<hr size="2" />VC# forever
Commenter la réponse de cs_Bidou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.