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 :

Iterateur sur sous élément


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut Iterateur sur sous élément


    Je suis en train de me bricoler ce que l'on pourrait appeler une SortedTable pour des éléments maison.
    Techniquement, j'ai donc cette classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class FlowsTable implements Iterable<IFlowConfiguration>{
    	...
    	private TreeSet<FlowElements> table;
    FlowElements étant une classe incluse simplissime, dans l'idée une bête structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class FlowElements {
     
    	IFlowConfiguration configuration;
    	IFlowReport report;
    	FlowStreamChannel channel;
    Et donc j'aimerai rendre FlowsTable iterable suivant les IFlowConfiguration, IFlowReport et FlowStreamChannel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
        public Iterator<IFlowConfiguration> iterator() {
    
    	    table.iterator() 
    
    	    return null;
        }
    Est il possible de passer par le table.iterator pour éviter d'avoir à tout redéfinir ? Sinon, existe il un moyen rapide de définir un itérateur ?

  2. #2
    Membre confirmé

    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Par défaut
    Bonjour,

    ta classe FlowsTable ne devrait pas implementer Iterable<FlowElements> plutot que Iterable<IFlowConfiguration> ?

    ta methode devrait marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Override
        public Iterator<FlowElements> iterator() {
    	    return table.iterator();
        }
    rmq: FlowElements devrait s'appeler FlowElement (sans "s")

    si tu veux vraiment implementer Iterable<IFlowConfiguration>, ca risque d'etre un peu plus compliqué (mais pas infaisable je pense)

    en esperant que ca t'aide

    Sylvain

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Comme je le disait, FlowElement n'est jamais qu'une classe censé être la plus anodine possible (en C# j'aurais fait une struct) qui ne doit pas sortir de FlowTable. A ce sujet, si vous avez des suggestions genre classe anonyme ou des possibilités sympathiques de java dans ce gout là, je veux bien en entendre parler ^^
    Donc un iterateur dessus ne m'intéresse pas car pas adapté à un usage externe.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rmq: FlowElements devrait s'appeler FlowElement (sans "s")
    C'est interdit les S dans la convention de codage java / sun / machin ?


    En définitive j'ai une solution pour cette histoire d'itérateur : je projette la colonne (ie les IFlowConfiguration ou IFlowReport ..) à itérer dans un arraylist. On ne peut pas implémenter trois fois la même interface Iterator<config>, Iterator<report> ... ( dommage ) mais le niveau au dessus pourra utiliser les projection pour faire son taff.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Bonjour :
    Tu peux utiliser l'introspection si IFlowConfiguration, IFlowReport et FlowStreamChanne ne dérivent pas d'une interface commune (ICommun par exemple), ou peut être définir une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object get(String name)
    qui retourne le bon attribut dans la classe FlowElements selon la valeur de name, et apres tu défini un itérateur paramétré comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Iterator<? extends ICommun> iterator(String name) {
    //selon le name tu retourne un Iterator spécifique..
    }
    Cdlt

  5. #5
    Membre confirmé

    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Par défaut
    Citation Envoyé par Nalfeim Voir le message
    Comme je le disait, FlowElement n'est jamais qu'une classe censé être la plus anodine possible (en C# j'aurais fait une struct) qui ne doit pas sortir de FlowTable. A ce sujet, si vous avez des suggestions genre classe anonyme ou des possibilités sympathiques de java dans ce gout là, je veux bien en entendre parler ^^
    Donc un iterateur dessus ne m'intéresse pas car pas adapté à un usage externe.
    ok, dans ce cas, la "inner class" que tu as fait me semble appropriée pour représenter une structure interne.

    rmq: FlowElements devrait s'appeler FlowElement (sans "s")
    C'est interdit les S dans la convention de codage java / sun / machin ?
    non, c'est juste que j'ai l'impression que FlowElements represente 1 seul element

    En définitive j'ai une solution pour cette histoire d'itérateur : je projette la colonne (ie les IFlowConfiguration ou IFlowReport ..) à itérer dans un arraylist. On ne peut pas implémenter trois fois la même interface Iterator<config>, Iterator<report> ... ( dommage ) mais le niveau au dessus pourra utiliser les projection pour faire son taff.
    juste une idée meme si tu as deja resolu ton pb, voici une solution qui evite de dupliquer les données dans une ArrayList: créer une autre inner class "IteratorInterne"

    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
     
    abstract class IteratorInterne<T> implements Iterator<T> {
    	Iterator<FlowElement> itInterne = table.iterator();
     
    	public boolean hasNext() {
    		return itInterne.hasNext();
    	}
     
    	public T next() {
    		return getValue(itInterne.next());
    	}
     
    	public void remove() {
    		itInterne.remove();
    	}
     
    	protected abstract T getValue(FlowElement next);
     
    }
    et des methodes pour recuperer un iterator ou un iterable sur une "colonne" particuliere depuis FlowsTable

    ex pour IFlowConfiguration:

    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
     
    public Iterator<IFlowConfiguration> iteratorConfiguration() {
    	return new IteratorInterne<IFlowConfiguration>() {
    		@Override
    		protected IFlowConfiguration getValue(FlowElement next) {
    			return next.configuration;
    		}
    	};
    }
     
    public Iterable<IFlowConfiguration> configurations() {
    	return new Iterable<IFlowConfiguration>() {
     
    		public Iterator<IFlowConfiguration> iterator() {
    			return iteratorConfiguration();
    		}
     
    	};
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    C'est un peu ce que je cherchais à faire au début. Histoire de pas perdre de temps ma solution actuelle suffira, mais je te remercie pour celle-ci qui servira la prochaine fois

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

Discussions similaires

  1. Disabled sur des éléments de formulaire sous IE
    Par vince351 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/04/2009, 23h23
  2. Réponses: 1
    Dernier message: 22/12/2008, 10h15
  3. [XSLT] somme sur les éléments d'un sous arbre
    Par Raumfahrerralf dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 17/03/2007, 16h23
  4. probleme de vue sur sous formulaire
    Par fabrice518 dans le forum Access
    Réponses: 12
    Dernier message: 05/09/2005, 10h35
  5. Action sur sous-formulaire filtré
    Par thevenix dans le forum IHM
    Réponses: 4
    Dernier message: 20/06/2005, 00h39

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