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 :

Générics et découpage de collections


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 42
    Par défaut Générics et découpage de collections
    bonjour à tous,

    je voudrais créer une fonction qui découpe une collection en en plusieurs sous collection de taille fixe, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    List<String> list = new ArrayList<String>();
     
    //opérations sur la listes (add, ...)
     
     
    List<List<String> listeDecoupee= decoupage(list, 5);
     
    //parcours pour afficher tous les elements
    for(List<String> subList : list) {
        for(String str : subList) 
           sysout(str)
    }
    pour l'instant si je n'utilise que des List ça fonctionne impec avec ça :
    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
    public static <T> List<List<T>> splitIntoChunks(List<T> list, int chunkSize) {
    		if (chunkSize <= 0)
    			throw new IllegalArgumentException("chunkSize must be greater than 0.");
     
    		List<List<T>> retVal = new ArrayList<List<T>>();
     
    		int index = 0;
     
    		while (index < list.size()) {
    			int count = list.size() - index > chunkSize ? chunkSize : list.size() - index;
    			retVal.add(list.subList(index, index+count));
     
    			index += chunkSize;
    		}
     
    		return retVal;
    	}
    j'aimerais donc généraliser ça pour tout type de collection genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set<UUID> set = new HashSet<UUID>();
     
    //opérations quelconques ( ...)
     
     
    Set<Set<UUID> decoupee= decoupage(set, 20);

  2. #2
    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
    Par défaut
    bonjour,

    Je ne comprend pas vraiment le problème ?
    Il suffit de remplacer List par Collection et voila !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 42
    Par défaut
    justement je voudrais garder le type de collection passé en argument.

    si on passe une List<String> ça renvoi une List<List<String>

  4. #4
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Passer en Collection ne suffira pas car la méthode list.subList() est propre aux java.util.List.

    De même, il y a pas de subList pour les Set ^^.

    Par ces arguments il est donc impossible de généraliser. Et je doute que ce soit réalisable même en modifiant le contenu de splitIntoChunks.

  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
    Par défaut
    en fait, j'avais pas fait attention, mais je pense que tu va avoir du mal à généraliser.
    La cause est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    list.subList(index, index+count)
    Le sublist est un peu particulier et en plus n'existe pas sur les collections mais uniquement sur les List. Et je doute que tu arrives a avoir équivalant sur les "Set" et autres collections.

    Edit : ah grillé de peu
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Par défaut
    Et si tu fais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Splitter<T extends Collection<V>, V extends Collection<String>> {
     
    	public T decoupage(V list,int chunkSize){
                    //balbla
    		return null;
    	}
     
    }
    par contre tu peux pas utiliser des fonctions statiques pour ça

  7. #7
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    J'ai pondu du code rapidement sans tester mais rien ne me semble impossible :
    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
    	public static <T> Collection<Collection<T>> splitIntoChunks(Collection<T> collection, int chunkSize) {
    		if (chunkSize <= 0)
    			throw new IllegalArgumentException(
    					"chunkSize must be greater than 0.");
     
    		Collection<Collection<T>> retVal = new ArrayList<Collection<T>>();
    		Collection<T> col = null;
     
    		int index = 0;
     
    		for (T t : collection) {
    			if(index%chunkSize == 0){
    				col = collection.getClass().newInstance();
    				retVal.add(col);
    			}
    			col.add(t);
    			index++;
    		}
     
    		return retVal;
    	}
    Pas forcement ce qu'il y a de plus performant mais ca doit marcher

  8. #8
    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
    Par défaut
    Citation Envoyé par Mobius Voir le message
    Pas forcement ce qu'il y a de plus performant mais ca doit marcher
    Eh non ca ne marche pas, car ce ne sont pas des vues de la collection d'origine. Par conséquent, si tu modifie la collection d'origine ca ne sera pas répercuté dans la collection découpé, et inversement bien sur.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. System collections généric list
    Par Plano dans le forum VB.NET
    Réponses: 2
    Dernier message: 30/10/2009, 19h35
  2. collection généric VS tableau
    Par djoao dans le forum Framework .NET
    Réponses: 5
    Dernier message: 29/04/2008, 11h28
  3. [VB6] la collection controls
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 30/04/2003, 17h03
  4. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

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