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 :

Méthode shuffle sur une partie du tableau seulement


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 176
    Points : 198
    Points
    198
    Par défaut Méthode shuffle sur une partie du tableau seulement
    Bonjour, est il possible de faire un "shuffle" sur une partie d'un tableau?

  2. #2
    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 : 54
    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,

    Je ne connais aucune méthode shuffle() qui prend un tableau en argument, mais la méthode Collections.shuffle(List) permet de faire un shuffle sur une liste, donc on peut utiliser cette méthode pour faire un shuffle sur une sublist :


    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
    public static void main(String[] args) {
     
    	Integer[] array = new Integer[20];
    	for(int i=0; i<array.length; i++) {
    		array[i]=i;
    	}
     
    	array = shuffle(array, 5, 15);
     
    	System.out.println(Arrays.toString(array));
     
    }
     
    public static <T> T[] shuffle(T[] array, int start, int end) {
     
    	List<T> list = new ArrayList<>(Arrays.asList(array));
     
    	Collections.shuffle(list.subList(start, end));
     
            return list.toArray(array);
     
    }
    Résultat :
    [0, 1, 2, 3, 4, 11, 14, 10, 7, 8, 13, 5, 12, 9, 6, 15, 16, 17, 18, 19]

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Tout à fait, mais, euh.... Pourquoi encapsuler dans une ArrayList ? Arrays.asList() me semblait suffire :

    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
    public static void shuffle(Object[] array, int start, int end) {
     
      // voir le tableau comme une List
      List<Object> list = Arrays.asList(array);
     
      // prendre une vue d'une partie de la liste
      list = list.subList(start, end);
     
      // mélanger
      Collections.shuffle(list);
    }
     
    public static void main(String[] args) {
     
      Integer[] array = new Integer[20];
      for(int i=0; i<array.length; i++) {
        array[i]=i;
      }
     
      shuffle(array, 5, 15);
     
      System.out.println(Arrays.toString(array));
    }
    Aussi, petite remarque annexe : j'ai pas trouvé de moyen de faire la même chose avec un tableau de primitifs, genre int[].
    Seules solutions que je vois :
    - extraire la partie du tableau qu'on veut mélanger, la mélanger, et réinsérer le résultat
    OU
    - implémenter soi-même l'algorithme pour mélanger.

  4. #4
    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 : 54
    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
    Citation Envoyé par thelvin Voir le message
    Tout à fait, mais, euh.... Pourquoi encapsuler dans une ArrayList ? Arrays.asList() me semblait suffire :
    Oui, la force de l'habitude de faire ça, avec Arrays.asList(), parce que le changement de taille est impossible. Mais c'est vrai que là, on ne change pas la taille... C'est bien le problème des habitudes, elle deviennent des réflexes et on réfléchit plus
    Aussi, petite remarque annexe : j'ai pas trouvé de moyen de faire la même chose avec un tableau de primitifs, genre int[].
    Seules solutions que je vois :
    - extraire la partie du tableau qu'on veut mélanger, la mélanger, et réinsérer le résultat
    OU
    - implémenter soi-même l'algorithme pour mélanger.
    Oui, je n'ai pas fait de remarque sur ce cas, attendant la question le cas échéant

    Par réflexion, peut-être, ce qui permet d'éviter de dupliquer la partie l'extraction pour tous les types.

    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
    public static void shuffle(int[] array, int start, int end) {
    	internalShuffle(array, start, end);
    }
     
    public static void shuffle(double[] array, int start, int end) {
    	internalShuffle(array, start, end);
    }
     
    private static void internalShuffle(Object array, int start, int end) {
     
    	if (array.getClass().isArray()) {
    		if ( start<0 || end<start ) throw new ArrayIndexOutOfBoundsException();
    		int length = Array.getLength(array);
    		if ( end>length || start>end ) throw new ArrayIndexOutOfBoundsException();
    		Object[] oarray = new Object[end-start];
    		for (int i = 0; i < oarray.length; i++) {
    			oarray[i] = Array.get(array, i+start);
    		}
    		Collections.shuffle(Arrays.asList(oarray));
    		for (int i = 0; i < oarray.length; i++) {
    			Array.set(array, i+start, oarray[i]);
    		}
    	} else {
    		throw new IllegalArgumentException("Not an array");
    	}
    }

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 176
    Points : 198
    Points
    198
    Par défaut
    @ Joel en effet désolé d'avoir tronqué le nom de la méthode.
    Merci a vous deux vous avez plus que répondu a ma question.

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

Discussions similaires

  1. Variable pointant sur une partie du tableau
    Par huître dans le forum C
    Réponses: 6
    Dernier message: 17/04/2015, 16h48
  2. Réponses: 2
    Dernier message: 02/04/2015, 17h06
  3. Réponses: 1
    Dernier message: 11/06/2007, 21h31
  4. Scrollbar sur une partie d'un tableau
    Par Dams59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/04/2007, 09h40
  5. JScrollPane : scroll que sur une partie du tableau
    Par mickael.guilbert dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 21/08/2006, 08h53

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