Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
692 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Trier un tableau a DEUX dimensions !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Trier un tableau a DEUX dimensions !

n°238437
casquetta
Posté le 02-11-2002 à 01:55:29  profilanswer
 

Imaginez un tableau a 2 dimensions comme suit :
 
blabla 1
zlizli 2
ploplo 3
 
on a X lignes et 2 collones  
 
Maintenant je veut le trier de tel maniere que la premiere collone se trie par ordre alphabetique et que la seconde collone associé reste avec cela donnerais :
 
blabla 1
ploplo 3
zlizli 2
 
 
comment je peut faire ? avez vous une idée ?
thx :jap:
 

mood
Publicité
Posté le 02-11-2002 à 01:55:29  profilanswer
 

n°238442
karim63
Posté le 02-11-2002 à 02:16:52  profilanswer
 

benh deja tu peux pas utiliser un array a 2 dimension car tes deux colones sont pas du même type.
Donc tu fé deux array a une dimension de la même taille et c bon.
 
et pi tu trie le premier, et a chaque fois que tu bouges les elements du premier tableau colonne A[j]=A[i] et bien tu fais pareil avec l'autre B[j]=B[i] .
Wouala  :wahoo:


Message édité par karim63 le 02-11-2002 à 02:17:41
n°238445
karim63
Posté le 02-11-2002 à 02:21:52  profilanswer
 

désolé j'avais pas vu que c'etait du JAVA sous koi tu developpait, je croyais que c'etait pascal .
Donc c ptetre possible de faire des tableaux avec des cellules pas du même type.
 :sleep:

n°238451
benou
Posté le 02-11-2002 à 03:33:17  profilanswer
 

java.util.Arrays.sort avec le comparator qui va bien :
 

Code :
  1. package test;
  2. public class SortArray {
  3.    public static void displayTableau(Object[][] tab) {
  4.       for (int i = 0; i < tab.length; i++) {
  5.          for (int j = 0; j < tab[i].length; j++) {
  6.             System.out.print(tab[i][j]);
  7.             System.out.print(' ');
  8.          }
  9.          System.out.println(); 
  10.       }
  11.       System.out.println();     
  12.    }
  13.    public static void main (String[] args) {
  14.  
  15.       Object[][] tableau = {
  16.          {"blabla", new Integer(1)},
  17.          {"zlizli", new Integer(2)},
  18.          {"ploplo", new Integer(3)}
  19.       };
  20.       displayTableau(tableau);
  21.       java.util.Arrays.sort(tableau, new AlphaComparator());
  22.       displayTableau(tableau);
  23.      
  24.    }
  25. }
  26. class AlphaComparator implements java.util.Comparator {
  27.    public int compare(Object o1, Object o2) {
  28.       return ((String) ((Object[]) o1)[0]).compareTo(((Object[]) o2)[0]);
  29.    }
  30. }

n°238458
darklord
You're welcome
Posté le 02-11-2002 à 09:35:48  profilanswer
 

benou >>>  :jap:  :jap:  :jap:


---------------
Just because you feel good does not make you right
n°238493
benou
Posté le 02-11-2002 à 11:37:45  profilanswer
 

DarkLord a écrit a écrit :

benou >>>  :jap:  :jap:  :jap:  




 :ange:  :)

n°238573
casquetta
Posté le 02-11-2002 à 15:32:15  profilanswer
 

benou a écrit a écrit :

java.util.Arrays.sort avec le comparator qui va bien :
 

Code :
  1. package test;
  2. public class SortArray {
  3.    public static void displayTableau(Object[][] tab) {
  4.       for (int i = 0; i < tab.length; i++) {
  5.          for (int j = 0; j < tab[i].length; j++) {
  6.             System.out.print(tab[i][j]);
  7.             System.out.print(' ');
  8.          }
  9.          System.out.println(); 
  10.       }
  11.       System.out.println();     
  12.    }
  13.    public static void main (String[] args) {
  14.  
  15.       Object[][] tableau = {
  16.          {"blabla", new Integer(1)},
  17.          {"zlizli", new Integer(2)},
  18.          {"ploplo", new Integer(3)}
  19.       };
  20.       displayTableau(tableau);
  21.       java.util.Arrays.sort(tableau, new AlphaComparator());
  22.       displayTableau(tableau);
  23.      
  24.    }
  25. }
  26. class AlphaComparator implements java.util.Comparator {
  27.    public int compare(Object o1, Object o2) {
  28.       return ((String) ((Object[]) o1)[0]).compareTo(((Object[]) o2)[0]);
  29.    }
  30. }






 
 
Merci bien, je ne comprenais pas vraiment comment marchais le Comparator maintenant un peu mieux
 
Merci bien ca fonctionne du tonnerre
 
 
Mais un nouveau probleme se pose
je voudrais maintenant la meme chose mais avec 3 composantes  
 
blabla bla 1  
zlizli bli 2  
ploplo blo 3  
 
et le trie pourra se faire sur soit la 1ere soit la 2nde composante, jai vraiment reflechit mais je ne sais pas comment m'y prendre
 
merci

n°238638
MachinBidu​le
Posté le 02-11-2002 à 19:13:41  profilanswer
 

casquetta a écrit a écrit :

 
 
 
Merci bien, je ne comprenais pas vraiment comment marchais le Comparator maintenant un peu mieux
 
Merci bien ca fonctionne du tonnerre
 
 
Mais un nouveau probleme se pose
je voudrais maintenant la meme chose mais avec 3 composantes  
 
blabla bla 1  
zlizli bli 2  
ploplo blo 3  
 
et le trie pourra se faire sur soit la 1ere soit la 2nde composante, jai vraiment reflechit mais je ne sais pas comment m'y prendre
 
merci




 
Là, t'as le code pour trier sur le 1er élément de ton tableau (cf la méthode donnée par Benou):
 

Code :
  1. class AlphaComparator implements java.util.Comparator {
  2.   public int compare(Object o1, Object o2) {
  3.      return ((String) ((Object[]) o1)[0]).compareTo(((Object[]) o2)[0]);
  4.   }
  5. }


 
Si tu veux disposer d'un tableau à 3 éléments et trier un coup sur le 1er, tu utilises la classe AlphaComparator, pour trier sur le second élément, tu crées une nouvelle classe semblable à AlphaComparator (ci-dessous)
 

Code :
  1. class AlphaComparator2 implements java.util.Comparator {
  2.   public int compare(Object o1, Object o2) {
  3.      return ((String) ((Object[]) o1)[1]).compareTo(((Object[]) o2)[1]);
  4.   }
  5. }


 
[Indice 1 pour le second élement au lieu de indice 0]
 
Puis t'indiques dynamiquement au moment de l'exécution quel Comparator utiliser pour ton tri en passant par une méthode actionPerformed()...


Message édité par MachinBidule le 02-11-2002 à 19:15:32
n°238688
casquetta
Posté le 02-11-2002 à 21:35:24  profilanswer
 

MachinBidule a écrit a écrit :

 
 
Là, t'as le code pour trier sur le 1er élément de ton tableau (cf la méthode donnée par Benou):
 

Code :
  1. class AlphaComparator implements java.util.Comparator {
  2.   public int compare(Object o1, Object o2) {
  3.      return ((String) ((Object[]) o1)[0]).compareTo(((Object[]) o2)[0]);
  4.   }
  5. }


 
 
Si tu veux disposer d'un tableau à 3 éléments et trier un coup sur le 1er, tu utilises la classe AlphaComparator, pour trier sur le second élément, tu crées une nouvelle classe semblable à AlphaComparator (ci-dessous)
 

Code :
  1. class AlphaComparator2 implements java.util.Comparator {
  2.   public int compare(Object o1, Object o2) {
  3.      return ((String) ((Object[]) o1)[1]).compareTo(((Object[]) o2)[1]);
  4.   }
  5. }


 
[Indice 1 pour le second élement au lieu de indice 0]
 
Puis t'indiques dynamiquement au moment de l'exécution quel Comparator utiliser pour ton tri en passant par une méthode actionPerformed()...




 
merci beaucoup
c'etait tellement bete lol
 
franchement merci a tous, votre aide m'a été tres precieuse ! :jap:


Message édité par casquetta le 02-11-2002 à 22:34:34
n°238708
casquetta
Posté le 02-11-2002 à 22:33:28  profilanswer
 

tiens une question :
 
actuellement je travaille avec un tableau fixe de ce type :
 
Object[][]tName  = {
                 {"blabla", new Integer(0),"roror"},
                 {"plapla", new Integer(1),"pouet"},
                 {"kilki", new Integer(2),"copoo"},            
            };
 
mais j'aimerais modifier cette structure afin que je puisse travailler sur quelquechose de dynamique, que je puisse ajouté des entrés et en supprimer comme je le veut
 
vous me conseillez quoi ?
tout en gardant bien sur la possibilité davoir plusieurs dimensions car j'en ai besoin !
 
merci

mood
Publicité
Posté le 02-11-2002 à 22:33:28  profilanswer
 

n°238724
benou
Posté le 02-11-2002 à 23:46:14  profilanswer
 

une solution un peu plus élégante que de faire une nouvelle classe pour trier sur une autre colone : passer en paramètre au comparator la colone sur laquelle trier :
 

Code :
  1. package test;
  2. public class SortArray {
  3.    public static void displayTableau(Object[][] tab) {
  4.       for (int i = 0; i < tab.length; i++) {
  5.          for (int j = 0; j < tab[i].length; j++) {
  6.             System.out.print(tab[i][j]);
  7.             System.out.print(' ');
  8.          }
  9.          System.out.println(); 
  10.       }
  11.       System.out.println();     
  12.    }
  13.    public static void main (String[] args) {
  14.  
  15.       Object[][] tableau = {
  16.          {"blabla", "bla", new Integer(1)},
  17.          {"zlizli", "bli", new Integer(2)},
  18.          {"ploplo", "blo", new Integer(3)}
  19.       };
  20.       displayTableau(tableau);
  21.       java.util.Arrays.sort(tableau, new AlphaComparator(0));
  22.       displayTableau(tableau);
  23.       java.util.Arrays.sort(tableau, new AlphaComparator(1));
  24.       displayTableau(tableau);
  25.      
  26.    }
  27. }
  28. class AlphaComparator implements java.util.Comparator {
  29.  
  30.    private int column;
  31.  
  32.    public AlphaComparator(int column) {
  33.       this.column = column;
  34.    }
  35.  
  36.    public int compare(Object o1, Object o2) {
  37.       return ((Comparable) ((Object[]) o1)[column]).compareTo(((Object[]) o2)[column]);
  38.    }
  39. }


Message édité par benou le 02-11-2002 à 23:48:17
n°238726
casquetta
Posté le 02-11-2002 à 23:50:38  profilanswer
 

merci benou ;) :jap:
 
et tu aurais pas une idée pour mon second probleme car je bloque carrément la
 
 
je voudrais la meme chose que cette structure mais en dynamique, afin de pouvoir ajouté, retiré des elements !
 
jarrive pas et je seche completement la !
 
merci davance

n°238727
benou
Posté le 02-11-2002 à 23:51:38  profilanswer
 

casquetta a écrit a écrit :

 
mais j'aimerais modifier cette structure afin que je puisse travailler sur quelquechose de dynamique, que je puisse ajouté des entrés et en supprimer comme je le veut




 
ben ca dépend de ce que tu veux avoir ...
 
actuellement les éléments de ton tableau sont des tableaux qui ont tous la même taille. C'est toujours le cas ?
 
si oui, pkoi est ce que tu n'écrit pas un obket qui contient ces données (2 string et un int). Ensuite, tu n'as plus qu'à déclarer une List (Vector ou mieux ArrayList) et tu pourras ajouer ou supprimer autant d'éléments que tu veux ...
 
si tes données ne sont pas de taille fixe, tu peux toujours utiliser des List de tableaux ou des List de List mais c'est pas très très beau ... à moins que ca correspondent bien à la nature de tes données


Message édité par benou le 02-11-2002 à 23:54:17
n°238729
benou
Posté le 02-11-2002 à 23:53:54  profilanswer
 

si tu parts sur les list, tu peux utiliser la méthode java.util.Collections.sort() pour trier tes List.

n°238730
casquetta
Posté le 02-11-2002 à 23:55:06  profilanswer
 

bah ce que je veut faire c que la j'ai ca :
 

Code :
  1. Object[][] tableau = {
  2.         {"blabla", new Integer(1),"blabla"},
  3.         {"zlizli", new Integer(2),"bla"},
  4.         {"ploplo", new Integer(3),"ooabla"}
  5.      };


 
c pouvoir ajouter des lignes afin davoir par exemple
 

Code :
  1. Object[][] tableau = {
  2.         {"blabla", new Integer(1),"blabla"},
  3.         {"zlizli", new Integer(2),"bla"},
  4.         {"ploplo", new Integer(3),"ooabla"},
  5.         {"loplo", new Integer(4),"truc"},
  6.         {"popo", new Integer(5),"machin"} 
  7.      };


 
 
et pouvoir en retirer mais la je comprend pas ce que tu veut me dire.... désolé de mon ignorance
 
ps : le tri fonctione exactement comme je le veut, ce que je veut maintenant c avoir une structure dynamique mais qui est la meme guelle koi


Message édité par casquetta le 02-11-2002 à 23:59:18
n°238736
benou
Posté le 03-11-2002 à 00:19:15  profilanswer
 

un exemple en définissant un objet pour stocker tes données :
 

Code :
  1. package test.casquetta;
  2. public class Data {
  3.    private String s1;
  4.    private int i;
  5.    private String s2;
  6.    public Data(String s1, int i, String s2) {
  7.       this.s1 = s1;
  8.       this.i = i;
  9.       this.s2 = s2;
  10.    }
  11.    public String getS1() {
  12.       return s1;
  13.    }
  14.    public String getS2() {
  15.       return s2;
  16.    }
  17.    public int getI() {
  18.       return i;
  19.    }
  20.    public String toString() {
  21.       return s1 + ' ' + i + ' ' + s2;
  22.    }
  23. }


 

Code :
  1. package test.casquetta;
  2. import java.util.*;
  3. public class Test {
  4.    public static void main (String[] args) {
  5.       List tableau = new ArrayList();
  6.       tableau.add(new Data("blabla", 1, "bla" ));
  7.       tableau.add(new Data("zlizli", 1, "bli" ));
  8.       tableau.add(new Data("ploplo", 1, "blo" ));
  9.      
  10.       System.out.println(tableau);
  11.       java.util.Collections.sort(tableau, new AlphaComparator1());
  12.       System.out.println(tableau);
  13.       tableau.add(new Data("tletle", 1, "ble" ));
  14.       java.util.Collections.sort(tableau, new AlphaComparator2());
  15.       System.out.println(tableau);
  16.       tableau.remove(3);
  17.       System.out.println(tableau);
  18.    }
  19. }
  20. class AlphaComparator1 implements java.util.Comparator {
  21.    public int compare(Object o1, Object o2) {
  22.       return ((Data) o1).getS1().compareTo(((Data) o2).getS1());
  23.    }
  24. }
  25. class AlphaComparator2 implements java.util.Comparator {
  26.    public int compare(Object o1, Object o2) {
  27.       return ((Data) o1).getS2().compareTo(((Data) o2).getS2());
  28.    }
  29. }


Message édité par benou le 03-11-2002 à 00:20:34
n°238738
casquetta
Posté le 03-11-2002 à 00:38:18  profilanswer
 

ok merci beaucoup de ton aide, je commence un peu a capter le truc
 
 
et donc par exemple est ce que je peut ecrire :
 
(tableau.get(2)).getI() ?
 
Afin de recuperer la valeur de i de l'element situé a la position 2 du tableau ?

n°238739
benou
Posté le 03-11-2002 à 00:41:32  profilanswer
 

oui mais il faut que tu castes l'objet :  
((Data) tableau.get(2)).getI()

n°238779
casquetta
Posté le 03-11-2002 à 12:45:45  profilanswer
 

benou a écrit a écrit :

oui mais il faut que tu castes l'objet :  
((Data) tableau.get(2)).getI()




 
 
jen etais sur !
 
Merci beaucoup benou, tu m'a beaucoup appris en lespace de ce topic
 
je continue mon boulot et si j'ai un pepin, jreviens lol
 
merci encore :jap: :jap:

n°238786
benou
Posté le 03-11-2002 à 13:24:38  profilanswer
 

you're welcome

n°848405
le_duc
PlaTyPuS
Posté le 13-09-2004 à 09:59:05  profilanswer
 

:)
 
Vous assurez les gars! C'est exactement ce que je cherchais :D! Merci benou! Et casquetta pour le post ;).
 
@++

n°848592
patachou
Posté le 13-09-2004 à 12:10:51  profilanswer
 

Je me suis posé une question en lisant ce topic sur quelle méthode est la plus efficace au niveau performance :
Lorsqu'on insere un objet dans un tableau (ou arrayList) déjà trié, est ce qu'il vaut mieux trouver la position à laquel il faut insérer le nouvel objet et l'ajouter directement à la bonne position, ou l'ajouter à la fin et faire un sort, ou si ca revient au même ?

n°849512
sircam
I Like Trains
Posté le 14-09-2004 à 00:04:44  profilanswer
 

patachou a écrit :

Je me suis posé une question en lisant ce topic sur quelle méthode est la plus efficace au niveau performance :
Lorsqu'on insere un objet dans un tableau (ou arrayList) déjà trié, est ce qu'il vaut mieux trouver la position à laquel il faut insérer le nouvel objet et l'ajouter directement à la bonne position, ou l'ajouter à la fin et faire un sort, ou si ca revient au même ?


Insérer un élément dans un tableau trié est une opération vachement couteuse, non seulement en temps d'exécution, mais également en code ! Tu imagines toute la plomberie à ré-écrire ?
 
Si tu dois ajouter plusieurs éléments avant d'utiliser la collection en question, mieux vaut ne trier qu'à la fin, plutôt que de déclencher un tri à chaque insertion.
 
Une LinkedList est sans doute mieux adaptée qu'un ArrayList pour ce genre d'opérations.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°849858
patachou
Posté le 14-09-2004 à 12:12:13  profilanswer
 

Moi j'ai besoin d'avoir une liste toujours triée après chaque insertion, donc il vaudrait mieux utiliser une LinkedList et faire un sort après chaque insertion ?

n°849908
the real m​oins moins
Posté le 14-09-2004 à 13:49:08  profilanswer
 

LinkedList n'est pas trié


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°849923
patachou
Posté le 14-09-2004 à 13:59:03  profilanswer
 

Oui mais une linkedList est une liste, donc on peut la trier... Moi tout ce que je voulais savoir c'etait de connaitre une bonne facon pour garder une liste (ou autre) triée...
sircam me disait qu'une linkedList serai plus approprié qu'un ArrayList (sans doute pour l'insertion...) mais je voulais en savoir plus histoire d'éviter de faire du code tout pourave comme j'arrive bien à faire...

n°849928
the real m​oins moins
Posté le 14-09-2004 à 14:00:37  profilanswer
 

bah ArrayList ou LinkedList, au niveau de ton code, ça ferait pas de difference, tu devras trier à chaque fois "à la main".


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°849948
gfive
Posté le 14-09-2004 à 14:29:21  profilanswer
 

Si tu dois avoir une liste triée tout le temps, l'insertion "en bonne place", avec un algo bien pensé, sera sans doute plus efficace que le "retri" après chaque insertion.
 
Enfin, ça dépend de l'algo de tri utilisé : y'en a qui sont très rapides si la source est "presque triée", ce qui est ton cas, puisque tu ajoutes un élément à un ensemble déjà trié,mais y'en a qui s'en tirent moins bien.
 
Sinon, tu peux utiliser un TreeSet, qui implémente SortedSet.


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°850038
sircam
I Like Trains
Posté le 14-09-2004 à 15:56:39  profilanswer
 

J'arrive pas à croire qu'il faudrait ré-écrire de la "plomberie" pour manipuler une structure de données basique comme la liste...
 
L'interface List fournit une méthode add(int, Object) qui permet d'insérer un élément à un endroit donné dans la liste, en décalant tous les éléments suivants.
 
Ton boulot consiste alors à insérer au bon endroit. Ta liste étant par définition déjà triée avant insertion, tu peux utiliser une recherche dichotomique pour déterminer l'endroit où l'insertion aura lieu.
 
Mais là encore, le choix ArrayList ou LinkedList aura une influence. Si l'insertion à proprement parler est plus rapide avec LinkedList, il ne faut perdre de vue que l'essentiel de ton boulot d'insertion est d'accéder à la liste (lors de la recherche).
 
Mais pq se casser le tronc, alors qu'il y a Collections.binarySearch ? Si l'élément n'est pas présent, cette méthode te renvoie l'endroit où l'élément devrait être inséré (la liste DOIT être triée avant appel).
 
Enfin, le TreeSet est sympa, mais Set n'autorise pas les doublons.

n°850153
patachou
Posté le 14-09-2004 à 18:32:12  profilanswer
 

Merci pour vos réponses, j'ai testé le binarySearch qui marche très bien sur un petit exemple et je pense que je vais me servir de ça plutot que de recoder un truc qui ferrai pareil (surtout que j'ai pas besoin de perf énorme, et que je suis pas sur de pouvoir faire mieux  :lol: ).

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Trier un tableau a DEUX dimensions !

 

Sujets relatifs
[VB6]Grille/tableau[VB6]TabStrip / Pb avec tableau multi-dimensionnel
[html] form ds un tableau change sa taille ...Gros prob de décalage dans tableau HTML
[JS] récupérer les dimensions d'une image [ - Job's Done - ]dimension d'un tableau bi-dimentionnel ?
Alterner la couleur des lignes d'un tableau ?Virer completement les marges à l'interieur des cellules d'un tableau
[C] passage d'une ligne ou d'une colonne d'un tableautrier un tableau
Plus de sujets relatifs à : Trier un tableau a DEUX dimensions !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR