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 :

[Tableau] Réinitialisation d'un tableau


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Par défaut [Tableau] Réinitialisation d'un tableau
    J'aimerai réinitialiser une portion d'un tableau avec une valeur déterminée.

    Existe-t-il une fonction performante pour effectuer cette affectation ? (un peu comme la fonction de copie System.arrayCopy)

    A défaut, toute solution me permettant d'éviter la classique boucle for est susceptible de m'intéresser.

    Par avance, merci de votre aide.

  2. #2
    Membre confirmé Avatar de waldo2188
    Profil pro
    Chef de projets
    Inscrit en
    Mars 2004
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Mars 2004
    Messages : 115
    Par défaut re
    pourais tu être plus claire.
    Quel type de tableau utilise tu, vecteur ou arraylist???

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Cela dépend le type de tableau...sinon un iterator() ca fonctionne très bien...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Par défaut
    En fait il s'agit d'un type tableau ordinaire.
    Je pourrais envisager de passer les donnée dans un autre format si cela me fais gagner en performance.

    Je cherche une fonctionnalité se rapprochant du memset en C, un peu comme la méthode System.arrayCopy se rapproche du memcpy (ok, je schématise un peu ).

    J'aimerai donc éviter si possible toute boucle et itérateur pour affecter une meme valeur à un ensemble d'éléments d'un tableau (une méthode du style setValue(double[] array, double value, int startIndex, int endIndex)).

    Voila, voila.

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    ce qui concerne les tableaux [] se trouve dans la classe java.util.Arrays.

    regarde dans la javadoc, en particulier la fonction fill().


    Enjoy yourself !

  6. #6
    Membre émérite
    Avatar de c-top
    Profil pro
    Turu
    Inscrit en
    Septembre 2003
    Messages
    972
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Turu

    Informations forums :
    Inscription : Septembre 2003
    Messages : 972
    Par défaut
    Citation Envoyé par JPigKeud
    J'aimerai donc éviter si possible toute boucle et itérateur pour affecter une meme valeur à un ensemble d'éléments d'un tableau (une méthode du style setValue(double[] array, double value, int startIndex, int endIndex)).

    Voila, voila.
    En fait une telle méthode cacherait surement une boucle sur cette portion de tableau...

  7. #7
    Membre expérimenté
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Par défaut
    En fait on peut faire un peut plus rapide que le boucle for (Arrays.fill en fait revient à la boucle for) on peut utiliser la dicotomie, il faut savaoir que System.ArrayCopy est plus rapide qu'une boucle for de copie, d'ou mon idée de l'utiliser aussi pour remplir.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
       /**
        * Remplit un tableau d'objets de la même valeur
        * @param objets
        *        Tableau à remplir
        * @param depart
        *        Position de départ
        * @param taille
        *        Nombre de case à remplir
        * @param valeur
        *        Valeur de remplissage
        */
       public static void remplir(Object[] objets, int depart, int taille,
             Object valeur)
       {
          if(objets == null)
          {
             throw new NullPointerException("Le tableau ne doit pas être null");
          }
          //On verifie la taille
          if(depart < 0)
          {
             taille += depart;
             depart = 0;
          }
          if(depart + taille > objets.length)
          {
             taille = objets.length - depart;
          }
          if(taille < 1)
          {
             return;
          }
          //On initialise le remplissage
          objets[depart] = valeur;
          int l = 1;
          int t = taille;
          //On copie, 1, puis 2, puis 4, ... jusqu'a a atteindre 2¨n ou n tel
          // maximun des n tels que 2¨n<=taille
          while(t > 1)
          {
             System.arraycopy(objets, depart, objets, depart + l, l);
             l *= 2;
             t /= 2;
          }
          //On remplit les cases restantes (si il y en a)
          int reste = taille - l;
          if(reste > 0)
          {
             System.arraycopy(objets, depart, objets, depart + taille - reste,
                   reste);
          }
       }
    On peut ensuite faire la même chose avec les type primitifs

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Par défaut
    Evidemment, la solution à mon problème de tableau se trouve dans la classe java.util.Arrays, honte sur moi de ne pas y avoir pensé

    Je vais également tester la méthode proposée par JHelp qui me semble très intéressante et vérifier les gains en terme de performance.

    Merci beaucoup pour votre aide.

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

Discussions similaires

  1. Initialisation d'un tableau à plusieurs dimensions
    Par kinouseb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2007, 13h16
  2. Initialisation d'un tableau de pointeurs
    Par tintin72 dans le forum C++
    Réponses: 19
    Dernier message: 19/11/2006, 10h22
  3. Problème d'initialisation d'un tableau
    Par Premium dans le forum C
    Réponses: 13
    Dernier message: 31/05/2006, 14h48
  4. Débutant : initialisation d'un tableau
    Par lebokto dans le forum C++
    Réponses: 7
    Dernier message: 02/11/2005, 15h50
  5. Initialisation d'un tableau de type STRUCT
    Par Axiome dans le forum MFC
    Réponses: 4
    Dernier message: 06/09/2005, 10h58

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