Trier un tableau a DEUX dimensions !

Trier un tableau a DEUX dimensions ! - Java - Programmation

Marsh Posté le 02-11-2002 à 01:55:29    

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:
 

Reply

Marsh Posté le 02-11-2002 à 01:55:29   

Reply

Marsh Posté le 02-11-2002 à 02:16:52    

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
Reply

Marsh Posté le 02-11-2002 à 02:21:52    

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:

Reply

Marsh Posté le 02-11-2002 à 03:33:17    

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. }

Reply

Marsh Posté le 02-11-2002 à 09:35:48    

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


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-11-2002 à 11:37:45    

DarkLord a écrit a écrit :

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




 :ange:  :)

Reply

Marsh Posté le 02-11-2002 à 15:32:15    

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

Reply

Marsh Posté le 02-11-2002 à 19:13:41    

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
Reply

Marsh Posté le 02-11-2002 à 21:35:24    

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
Reply

Marsh Posté le 02-11-2002 à 22:33:28    

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

Reply

Marsh Posté le 02-11-2002 à 22:33:28   

Reply

Marsh Posté le 02-11-2002 à 23:46:14    

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
Reply

Marsh Posté le 02-11-2002 à 23:50:38    

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

Reply

Marsh Posté le 02-11-2002 à 23:51:38    

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
Reply

Marsh Posté le 02-11-2002 à 23:53:54    

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

Reply

Marsh Posté le 02-11-2002 à 23:55:06    

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
Reply

Marsh Posté le 03-11-2002 à 00:19:15    

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
Reply

Marsh Posté le 03-11-2002 à 00:38:18    

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 ?

Reply

Marsh Posté le 03-11-2002 à 00:41:32    

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

Reply

Marsh Posté le 03-11-2002 à 12:45:45    

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:

Reply

Marsh Posté le 03-11-2002 à 13:24:38    

you're welcome

Reply

Marsh Posté le 13-09-2004 à 09:59:05    

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

Reply

Marsh Posté le 13-09-2004 à 12:10:51    

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 ?

Reply

Marsh Posté le 14-09-2004 à 00:04:44    

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}
Reply

Marsh Posté le 14-09-2004 à 12:12:13    

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 ?

Reply

Marsh Posté le 14-09-2004 à 13:49:08    

LinkedList n'est pas trié


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-09-2004 à 13:59:03    

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...

Reply

Marsh Posté le 14-09-2004 à 14:00:37    

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 ?
Reply

Marsh Posté le 14-09-2004 à 14:29:21    

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)
Reply

Marsh Posté le 14-09-2004 à 15:56:39    

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.

Reply

Marsh Posté le 14-09-2004 à 18:32:12    

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: ).

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed