Tri d un vector en java

Bonjour,

J 'un un vector avec plusieurs élements et je souhaiterais effectuer un tri croissant sur le 3 element il s 'agit d une chaine de caracteres .
Je sais qu 'il existe une fonction genre : collection.sort ... mais je n 'arrive pas à l 'utiliser .

Voici mon code :
// je declare mon vector
public Vector v_tableau = new vector();
// j 'appelle une methode pour alimenter mon vector qui est de type vector
v_tableau = GetListeCP()
// et puis c 'est maintenant que je souhaite faire un tri du vector sur le 3 element mais je n y arrive pas
//c un truc comme ça :
collection.sort
.....

Savez vous comment doit on proceder
Merci de vos réponses
Configuration: Windows XP
Internet Explorer 7.0

5 réponses

  1. Salut,

    Bon, je t'ai fait un petit programme tuto :
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.Vector;
    
    public class SortableVectorOfString extends Vector implements Comparator{
    
    	/*
    	 * Numéro du caractère sur lequel on va trier
    	 * (Attention, les indices commencent à 0)
    	 */
    	int numChar = 0;
    	
    	/*
    	 * fonction de tri
    	 */
    	private void sortStringVector(int numChar){
    		/*
    		 * On précise le numéro du caractère à partir duquel doit se faire
    		 * le tri
    		 */ 
    		this.numChar = numChar;
    		/*
    		 * Le 1er paramètre est le Vecteur à trier (moi-même)
    		 * Le 2ème paramètre est le Comparator à utiliser pour cela...
    		 * ... et c'est encore moi-même car j'implémente Comparator (ce
    		 * qui m'oblige à remplir le contrat de Comparator qui stipule 
    		 * que je dois fournir une méthode 'compare') 
    		 */
    		Collections.sort(this, this);
    	}
    
    	/* 
    	 * Fonction de comparaison
    	 * @param arg0 1er String à comparer
    	 * @param arg1 2ème String à comparer
    	 * @see java.util.Comparator#compare()
    	 */
    	public int compare(Object arg0, Object arg1) {
    		String s0 = (String)arg0;
    		String s1 = (String)arg1;
    		/*
    		 * Le plus pénible est de prendre en compte les cas où une des chaînes
    		 * n'a pas la longueur minimum requise pour le tri à partir du n-ième
    		 * caractère...
    		 */
    		if (s0.length() <= numChar) {
    			// Si le 1er String n'a pas la longueur minimum requise
    			if (s1.length() <= numChar) {
    				// ... ni le 2ème : on dit qu'elles sont égales
    				return 0;
    			} else {
    				// ... si le 2ème est à la maille : 
    				//     on dit que le 1er est plus petite
    				return -1;
    			}
    		} else {
    			// Si le 1er String est assez grand
    			if (s1.length() <= numChar) {
    				// ... mais pas le 2ème : on dit que le 1er est plus grand
    				return 1;
    			} else {
    				// Mais une fois ces cas traités, String fournit ce qu'il faut
    				return s0.substring(numChar).compareTo(s1.substring(numChar));
    			}
    		}
    	}
    
    	/*
    	 * Simple méthode d'affichage pour le test
    	 */
    	public void display(){
    		System.out.println("===============================");
    		System.out.println("Tri sur le car. " + numChar + ":");
    		for (Iterator iterator = iterator(); iterator.hasNext();) {
    			System.out.println(iterator.next());
    		}
    	}
    	
    	
    	public static void main(String[] args) {
    		// On crée l'objet
    		SortableVectorOfString svs = new SortableVectorOfString();
    		// On l'alimente un peu
    		svs.add("QsDfghjklm");
    		svs.add("AzErtyu");
    		svs.add("WxCvbn");
    		// 1er tri sur les chaînes complètes
    		svs.sortStringVector(0);
    		svs.display();
    		// 2ème tri ne distingue pas "AzErtyu" de "WxCvbn"
    		svs.sortStringVector(8);
    		svs.display();
    		// 3ème tri sur le 3ème car.
    		svs.sortStringVector(2);
    		svs.display();
    		// 4ème tri ne distingue toujours pas "AzErtyu" de "WxCvbn"
    		svs.sortStringVector(8);
    		svs.display();
    	}
    
    	
    }
    


    Ca devrait afficher :
    ===============================
    Tri sur le car. 0:
    AzErtyu
    QsDfghjklm
    WxCvbn
    ===============================
    Tri sur le car. 8:
    AzErtyu
    WxCvbn
    QsDfghjklm
    ===============================
    Tri sur le car. 2:
    WxCvbn
    QsDfghjklm
    AzErtyu
    ===============================
    Tri sur le car. 8:
    WxCvbn
    AzErtyu
    QsDfghjklm
    


    Bon courage pour la suite.

    Note: indique quelle version de java tu utilise la prochaine fois ;-)
    1. Contributeur
      Salut,
      Pas clair ?
      Ben, tu as ton tableau que tu souhaites trier qu'on va appeler tonTableau.
      import java.util.Collections;
      Collections.sort(tonTableau);
      

      Je vois pas comment être plus clair.

      Cordialement
      1. C'est psa clair ce que tu veux faire...
        tu peux mettre un exemple ?
        1. Contributeur
          De mémoire, il me semble que Collections.sort est statique. Donc je dirais : Collections.sort(tonTableau);
          import java.util.Collections; //ou quelque chose du genre

          En espérant que ça marchera.
          1. Bon un petit tri vite fait

            int i = 0;
            vecteur tmp;
            while (i< length)
            {
            //listevect -> tableau de vecteurs
            //listevect[i] -> vecteur à l'indice i du tableau de vecteur listevect
            //listevect[i][2] -> 3eme cordonnées du vecteur à l'indice i.....
            
            //tu peux remplacer listevect[i][2] par une fonction genre listevect[i].getz(); qui te renverrais ta 3 eme coordonnées.
            
            
            if(listevect[i][2] > listevect[i+1][2]){
            tmp = listevect[i][2];
            listevect[i][2] = listevect[i+1][2];
            listevect[i+1][2] = tmp;
            i = i - 1;
            }
            i++;
            }
            


            en gros je fait donc un bubble sort (tri à bulles)

            1. Merci pour ta réponse mais je ne pense pas que je puisse l 'adapter en java .
              En fait je veux sur une liste d 'un vecteur pouvoir trier un champ de caracteres par ordre croissant .
              La seule méthode qui semble pouvoir le faire est la méthode collection.sort mais je n 'arrive pas à la mettre en place .
            2. @fredovoid Tri(){

              for (i=0; i<tab.length-1; i++){

              double max;

              //rechercher du max et sa position

              max=tab[i];

              int i0=i;

              int j;

              for (j=i+1; j<tab.length; j++){
              if (tab[j] > max){

              i0=j;
              max=tab[j]; }
              }

              /**************************************/

              /*************Permutation*************/
              double f;

              f=tab[i];
              tab[i]=max;
              tab[i0]=f; }

              }