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

Collection et Stream Java Discussion :

Tassage d'un tableau avec java


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club Avatar de CompuTux
    Homme Profil pro
    Développeur Python et Django
    Inscrit en
    Juillet 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Python et Django
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut Tassage d'un tableau avec java
    Bonjour,

    Etant donné un tableau T de N nombres entiers positifs, j'aimerais écrire le programme qui le tasse, c'est-à-dire qui détecte les éléments nuls du tableau et qui récupère leur place en décalant vers le début du tableau tous les autres éléments.

    Evidemment, le programme que j'ai écrit ne marche pas :

    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
    30
    31
    32
    33
    34
    package exoalgo;
    import java.util.Random;
    /**
     *
     * @author cbohnert
     */
    public class Exo34 {
     
        public static void main(String[] args) {
     
         int tab[]=new int[10];
         int x=0;
     
         Random randomGenerator = new Random();
         for (int i=0; i<=tab.length-1;i++) { tab[i]= randomGenerator.nextInt(5); System.out.print(tab[i]+",");}
         System.out.println();
     
         for (int i=1;i<=tab.length-1;i++) {
     
             if (tab[i]==x) {
     
                tab[i]=tab[i+1]; 
             }
     
         }
     
         for (int i=0; i<=tab.length-1;i++) {System.out.print(tab[i]+","); }
         System.out.println();
         System.out.println(tab.length);
        }
     
     
     
    }

    J'obtiens pour un essai :

    init:
    deps-jar:
    compile-single:
    run-single:
    2,3,1,1,2,2,2,1,0,3,
    2,3,1,1,2,2,2,1,3,3,
    10
    BUILD SUCCESSFUL (total time: 0 seconds)
    C'est-à-dire que les zéros sont bien enlever mais il y a répétition de l'élément successeur ...

    Quelqu'un pourrait-il m'expliquer svp ??

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Tout d'abord, lorsque tu rencontre la valeur vide: if (tab[i]==x) { ...
    N'est déplacé que l'élément suivant.
    Il faut faire une seconde boucle for qui part de i et qui va jusqu'à la fin du tableau pour déplacer tout les éléments après i.

    Par ailleurs, lorsque le tableau change de taille, il n'y a pas d'autre moyen que de créer un nouveau tableau; on ne peut pas changer la taille d'une tableau dynamiquement.

  3. #3
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    puisqu'il faut faut réallouer de la mémoire lors du "tassement" du tableau, ne serait-il pas intéressant de parcourir le tableau initial, à la recherche d'élément valides, puis de créer un nouveau tableau dans lequel on copierait ces éléments ?

    Ou peut être travailler avec une classe ArrayList...

    En espérant que cela vous aide...

  4. #4
    Membre du Club
    Profil pro
    Coach Agile
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Points : 56
    Points
    56
    Par défaut
    Je valide il vaut mieu travailler avec une arraylist
    Tu parcours ton tableau et à chaque valeur non null (!=0) tu l'ajoute dans ta liste.

    Si tu as absolument besoin de tableau d'entier, rien de t'empêche de recréer un nouveau tableau à partir de ta liste

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,
    Je pense pas que travailler avec une arrayList soit une bonne solution d'un point de vue performance.
    Je verais plutot les choses comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      int taille = tab.length; // on garde la taille car celle ci va évoluer en cours de route.
      ..... // code de recherche des valeurs à supprimer
      // pour chaque valeur trouvé on fait ce qui suit
      int index = // l'index de la valeur à supprimer.
      int nbDepl = taille - index -1;
      if (nbDepl > 0) {
        System.arraycopy(tab, index+1, tab, index, nbDepl); // déplacement des données stocké après l'index
      }
       tab[--taille] = 0; // affectation sur la dernière cellule vidée

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par Alkhan Voir le message
    bonjour,
    Je pense pas que travailler avec une arrayList soit une bonne solution d'un point de vue performance.
    Je verais plutot les choses comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      int taille = tab.length; // on garde la taille car celle ci va évoluer en cours de route.
      ..... // code de recherche des valeurs à supprimer
      // pour chaque valeur trouvé on fait ce qui suit
      int index = // l'index de la valeur à supprimer.
      int nbDepl = taille - index -1;
      if (nbDepl > 0) {
        System.arraycopy(tab, index+1, tab, index, nbDepl); // déplacement des données stocké après l'index
      }
       tab[--taille] = 0; // affectation sur la dernière cellule vidée
    Je ne pense pas que faire une recopie de tableau à chaque élément supprimé soit une bonne solution non plus pour les performances (le nombre de copie de tableau augmente avec le nombre de zero présents dans le tableau original ).

    Je propose de créer un deuxième tableau de même taille que le premier, on y copie les entiers différents de 0 tout en comptant leur nombre puis enfin on crée le tableau final de bonne longueur et on y copie tous les éléments non nuls.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int[] tempTab = new int[tab.length];
    int index = 0;
    for(int value : tab) {
        if(value != 0) {
            tempTab[index ++] = value;
        }
    }
    int[] noZeroTab = new int[index];
    System.arraycopy(tempTab, 0, noZeroTab, 0, index);

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    +1 le y@m's je suis d'accord !

    Mon idée était surtout de garder le même tableau, et .... je plaide coupable, je suis parti du principe le son tableau ne sera pas beaucoup plus grand.

  8. #8
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Remarques en passant :
    • Pour afficher un tableau, Arrays.toString(monTableau) ;
    • une ArrayList utilise un tableau en interne (d'où son nom), rendant l'accès à une cellule rapide ;
    • on peut implémenter cet algo tout simple sans tout recopier à chaque 0 rencontré, il suffit de déplacer chaque cellule de N où N est le nombre de 0 précédement rencontrés.

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. que choisir (tableau avec java)
    Par walid2012 dans le forum Collection et Stream
    Réponses: 27
    Dernier message: 30/04/2006, 12h42
  3. pb de coord de tex dans tableau avec multitex
    Par sebh dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/01/2004, 21h36
  4. Réponses: 13
    Dernier message: 14/10/2003, 14h31
  5. [JNDI] Equivalent avec Java Web Start ?
    Par cameleon2002 dans le forum Java EE
    Réponses: 8
    Dernier message: 18/09/2003, 18h55

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