IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Trier un tableau en java


Sujet :

avec Java

  1. #1
    Nouveau membre du Club Avatar de gautier1er
    Homme Profil pro
    Developpeur C et PHP
    Inscrit en
    Août 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Developpeur C et PHP

    Informations forums :
    Inscription : Août 2017
    Messages : 61
    Points : 32
    Points
    32
    Par défaut Trier un tableau en java
    Bonjour à toutes et à tous,
    je crée une classe utilitaire pour gérer les tableaux à une dimension.
    L'une des méthodes de cette classe a pour but de trier un tableau dans l'ordre croissant :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     public static int []   croissant(int t[] )
     {
         int aide;
         int [] temp=new int[t.length];
         temp=t;
       for(int i=0;i<t.length;i++)
       {
           if(temp[i] > temp[i++] )
           {
            aide=temp[i++]; 
            temp[i++]=temp[i];
            temp[i]=aide;
           }
       }
     
       return temp;
     }
    L'appel de cette méthode ne tri pas le tableau concerné.

    Cordialement.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Essaie ce petit code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    class ForumDeveloppez{
        public static void main(String [] args){
            int t[] = {5, 55, 1, 558, 14, 12};
            int res[] = triCroissant(t);
            for(int j : res){
                System.out.print(j +" ");
            }
        }
        public static int [] triCroissant(int t []){
            int n = t.length, i = 0, aux = 0;
            boolean trie = true;
            while(trie){
                trie = false;
                i = 0;
                while(i < n - 1){
                    if(t[i] > t[i + 1]){
                        trie = true;
                        aux = t[i];
                        t[i] = t[i + 1];
                        t[i + 1] = aux;
                    }
                    i++;
                }
                n--;
            }
            return t;
        }
    }

  3. #3
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello,

    et tu as même un tri déjà tout fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.util.Arrays.sort(int[])

  4. #4
    Nouveau membre du Club Avatar de gautier1er
    Homme Profil pro
    Developpeur C et PHP
    Inscrit en
    Août 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Developpeur C et PHP

    Informations forums :
    Inscription : Août 2017
    Messages : 61
    Points : 32
    Points
    32
    Par défaut
    merci
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     public static int []   croissant(int t[] )
     {      
         java.util.Arrays.sort(t);
         return t;
     
     }

    la méthode fonctionne bien maintenant.
    J'aimerai aussi que tu me donne l'inverse , c'est à dire le tri décroissant

    merci d'avance

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pour répondre à la question initiale, le premier problème dans ton code se situe au niveau de l'emploi de i++. Cet opérateur (++) modifie (incrémente) la valeur de la variable à laquelle il est appliqué, mais la valeur utilisée est celle avant l'incrémentation. Donc quand tu fais if(temp[i] > temp[i++], çà correspond à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if ( temp[i]>temp[i] ) { // ce qui est toujours faux
        i=i+1; // si cette instruction était exécutée, tu avancerais d'un coup dans le tableau, donc tout le reste du code dans le bloc serait appliqué au mauvais index dans le tableau
    }
    Un autre problème est que tu ne fais qu'une passe : si une valeur n'est pas à sa place, ça va fonctionner, mais dès qu'il y'en a deux, ça ne triera que la plus grande et laissera les autres. Il suffit donc de recommencer le tri autant de fois que nécessaire. Quand sait-on qu'il faut s'arrêter : lorsqu'au cours d'une passe, on n'a pas fait d'échange. Une solution pour optimiser est de considérer que comme on pousse la valeur la plus grande à la fin, il suffit que la passe suivante ne traite pas la valeur à la fin, puisqu'on sait qu'elle est déjà trier : à chaque fois, on trie un tableau un peu plus petit, jusqu'à ce qu'on ait plus qu'un tableau de taille 0 à trier et on donc on s'arrête.
    Autre problème : la boucle for(int i=0;i<t.length;i++). Comme tu compares chaque case à sa suivante, il faut penser que lorsque tu vas comparer la dernière case, ça va planter puisque tu tenteras de comparer celle-ci avec une case en dehors du tableau, qui n'existe pas donc.
    Enfin, tu ne trie pas le tableau passé en paramètre, mais un autre tableau (temp) qui ne contient que des 0. Il ne sert à rien ce tableau, sauf si tu ne veux pas modifier le tableau original : dans ce cas, il faut au moins copier le tableau passé en paramètre dans temp. Une solution pourrait être d'en profiter pour trier ou prétrier lors de la copie.

    Pour répondre à la seconde question, il n'y a pas de méthode toute faite pour trier directement un tableau de int dans le sens décroissant. On peut le faire simplement pour des tableaux d'objets (Voir JavaDoc : tri avec comparateur, tri parallèle avec comparateur et comparateur qui inverse l'ordre.

    Pour le faire, il te suffit d'utiliser Arrays.sort() puis d'inverser le tableau. En corrigeant les problèmes de ton code initial, en revanche, ce sera très simple d'inverser l'ordre.

    Il y a bien une solution pour le faire avec un stream, mais c'est un peu overkill (et moins rapide et plus consommateur de mémoire) : int[] descendingArray = Arrays.stream(array).mapToObj(Integer::new).sorted(Comparator.reverseOrder()).mapToInt(Integer::intValue).toArray();

  6. #6
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par gautier1er Voir le message
    merci
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     public static int []   croissant(int t[] )
     {      
         java.util.Arrays.sort(t);
         return t;
     
     }

    la méthode fonctionne bien maintenant.
    J'aimerai aussi que tu me donne l'inverse , c'est à dire le tri décroissant

    merci d'avance
    petite note: c'est plutôt une bonne idée d'avoir une méthode qui prenne un paramètre et qui rende un tableau trié en résultat.
    Dans certains cas , pour vraiment se conformer à ce principe et pour ne pas avoir d'effet de bord, ce serait encore mieux de faire un clone du tableau paramètre, de trier ce clone et de le rendre en résultat. Certes on peut considérer que c'est du gâchis de dupliquer le tableau mais c'est plus propre dans une vision purement fonctionnelle.

  7. #7
    Nouveau membre du Club Avatar de gautier1er
    Homme Profil pro
    Developpeur C et PHP
    Inscrit en
    Août 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Developpeur C et PHP

    Informations forums :
    Inscription : Août 2017
    Messages : 61
    Points : 32
    Points
    32
    Par défaut
    j'ai repris ma méthode pour trier un tableau dans l'ordre croissant et j'ai aussi ajouter la méthode qui tri dans l'ordre décroissant. Ces deux méthodes marchent bien .
    la méthode crois
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     public static int [] crois(int t[] )
     {
         int aide=0;
     
          for(int i=0;i<t.length-1;i++)
          {
             for(int j=i+1;j<t.length;j++)
             {
               if(t[i]>t[j])
                {
                  aide=t[i];
                  t[i]=t[j];
                  t[j]=aide; 
                }
             }
          }
     
     
         return t;
     }


    la méthode decrois
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     public static int [] decrois(int t[] )
     {
         int aide=0;
     
          for(int i=0;i<t.length-1;i++)
          {
             for(int j=i+1;j<t.length;j++)
             {
               if(t[i]<t[j])
                {
                  aide=t[i];
                  t[i]=t[j];
                  t[j]=aide; 
                }
             }
          }
     
     
         return t;
     }

    D'après le professeur shadoko
    je ferai un clone du tableau passé en paramètre après vos avis sur ces deux méthodes

  8. #8
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par gautier1er Voir le message
    je ferai un clone du tableau passé en paramètre après vos avis sur ces deux méthodes
    tu pourras ainsi avoir 3 tableaux: le tableau d'origine, celui trié par ordre croissant et celui trié par ordre décroissant.
    (après on peut aussi argumenter comme quoi il est plus facile de faire le tableau décroissant à partir du tableau croissant ... mais bon)

  9. #9
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    Bonjour,
    j'adhère à l'idée de @Professeur Shadako il vaut mieux dans la majorité des cas quand on utilise des objets de faire un clone des données sur lesquelles on travaille après c'est un point de vu mais aussi cela permet de bénéficier des méthodes et autres joyaux objets imagines que tu as un String à trier et qu'on te demande de ne pas utilisé les tableaux juste des boucles.

  10. #10
    Nouveau membre du Club Avatar de gautier1er
    Homme Profil pro
    Developpeur C et PHP
    Inscrit en
    Août 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Developpeur C et PHP

    Informations forums :
    Inscription : Août 2017
    Messages : 61
    Points : 32
    Points
    32
    Par défaut
    voici les méthodes avec utilisation de clonage:
    méthode crois
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     public static int [] crois(int t[] )
     {
         int aide=0;
         int tab[]=new int[t.length];
         tab=t.clone();
          for(int i=0;i<tab.length-1;i++)
          {
             for(int j=i+1;j<tab.length;j++)
             {
               if(tab[i]>tab[j])
                {
                  aide=tab[i];
                  tab[i]=tab[j];
                  tab[j]=aide; 
                }
             }
          }
     
     
         return tab;
     }

    méthode decrois
    le tableau passé en paramètre de la méthode decrois est un tableau trié préalablement dans l'ordre croissant.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     public static int [] decrois(int t[])
      {
          int aide;
        int [] tab=new int[t.length];
        tab=t.clone();
        int j=tab.length;
     
        for(int i=0;i<j;i++)
        {
            --j; 
            aide=tab[i];
            tab[i]=tab[j];
            tab[j]=aide;
     
        }
     
        return tab;  
      }

  11. #11
    Nouveau membre du Club Avatar de gautier1er
    Homme Profil pro
    Developpeur C et PHP
    Inscrit en
    Août 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Developpeur C et PHP

    Informations forums :
    Inscription : Août 2017
    Messages : 61
    Points : 32
    Points
    32
    Par défaut
    Merci à tous ceux qui ont participé à ce sujet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Java - Trier un tableau sans changer l'ordre de ses valeurs
    Par chenwaZi dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 28/04/2015, 11h20
  2. Réponses: 7
    Dernier message: 21/01/2012, 14h08
  3. Trier un tableau en JAVA
    Par twingo321 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 04/10/2007, 08h45
  4. Trier un tableau par ordre croissant
    Par Halleck dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 01/11/2004, 00h04
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo