algo pour fusionner des collections

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

algo pour fusionner des collections

Nicolas Becu
Bonjour à tous,

Premier post de ma part, bien que je vous lis depuis quelques temps.
Je me présente donc. J'utilise smallTalk dans le cadre de
développement de modèles de simulation appliqués à la gestion du
territoire, bien souvent en m'appuyant sur la plateforme de
modélisation multi-agents Cormas.
J'aurai une question qui va certainement vous sembler toute bête.

Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
Collection ?
Ex. je veux obtenir un set rassemblant les éléments des array suivant
#(4 5 8) #(7 1 2) #(45 2 96)
Actuellement je créé une nouvelle instante Set new. Puis je fais trois
addAll:
Mais je me demande s'il n'y a pas plus "élégant".

Merci d'avance pour vos avis éclairés

Nicolas Becu
Chercheur au CNRS, UMR ProdiG
http://www.prodig.cnrs.fr/
Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

laurent laffont


2011/7/7 Nicolas Becu <[hidden email]>
Bonjour à tous,

Premier post de ma part, bien que je vous lis depuis quelques temps.
Je me présente donc. J'utilise smallTalk dans le cadre de
développement de modèles de simulation appliqués à la gestion du
territoire, bien souvent en m'appuyant sur la plateforme de
modélisation multi-agents Cormas.
J'aurai une question qui va certainement vous sembler toute bête.

Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
Collection ?
Ex. je veux obtenir un set rassemblant les éléments des array suivant
#(4 5 8) #(7 1 2) #(45 2 96)
Actuellement je créé une nouvelle instante Set new. Puis je fais trois
addAll:
Mais je me demande s'il n'y a pas plus "élégant".

Salut,

le premier truc qui me vient à l'esprit:

(#(4 5 8), #(7 1 2), #(45 2 96)) asSet

Laurent Laffont - @lolgzs

Pharo Smalltalk Screencasts: http://www.pharocasts.com/
Blog: http://magaloma.blogspot.com/
 

Merci d'avance pour vos avis éclairés

Nicolas Becu
Chercheur au CNRS, UMR ProdiG
http://www.prodig.cnrs.fr/

Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

cedreek
In reply to this post by Nicolas Becu
Bonjour et bienvenue,

addAll: me semble très élégant :)
En Smalltalk, le choix d'algo n'est pas souvent une priorité. De plus il ne s'agit pas vraiment de fusion de collection. La question se poserait éventuellement si tu devais créer des ensembles de tres grande tailles, ou si les tableaux contenait beaucoup d'éléments en doublons (et toujours de grande taille). Sinon addAll: est suffisant pour moi.

Sinon, comme alternative, tu peux aussi utiliser la méthode de classe newFrom:

Set newFrom: anArray1 , anArray2 , anArray3

ou encore

(anArray1 , anArray2 , anArray3) asSet

Dans tous les cas, si tu as des besoins de performances, utilises le Profiler ou simplement timeToRun

[10000 timesRepeat: [Set newFrom: anArray1 , anArray2 , anArray3]] timeToRun     "print it"
[10000 timesRepeat: [ ((Set newFrom: anArray1) addAll: anArray2 ;  yourself; addAll: anArray3]] timeToRun
...


Cédrick

Le 7 juil. 2011 à 10:18, Nicolas Becu a écrit :

> Bonjour à tous,
>
> Premier post de ma part, bien que je vous lis depuis quelques temps.
> Je me présente donc. J'utilise smallTalk dans le cadre de
> développement de modèles de simulation appliqués à la gestion du
> territoire, bien souvent en m'appuyant sur la plateforme de
> modélisation multi-agents Cormas.
> J'aurai une question qui va certainement vous sembler toute bête.
>
> Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
> Collection ?
> Ex. je veux obtenir un set rassemblant les éléments des array suivant
> #(4 5 8) #(7 1 2) #(45 2 96)
> Actuellement je créé une nouvelle instante Set new. Puis je fais trois
> addAll:
> Mais je me demande s'il n'y a pas plus "élégant".
>
> Merci d'avance pour vos avis éclairés
>
> Nicolas Becu
> Chercheur au CNRS, UMR ProdiG
> http://www.prodig.cnrs.fr/

Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

Damien Cassou
In reply to this post by Nicolas Becu
2011/7/7 Nicolas Becu <[hidden email]>:
> Mais je me demande s'il n'y a pas plus "élégant".

j'aurais fait exactement pareil

--
Damien Cassou
http://damiencassou.seasidehosting.st

"Lambdas are relegated to relative obscurity until Java makes them
popular by not having them." James Iry
Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

stephane ducasse-2
In reply to this post by laurent laffont
il faut attention car peut etre que , copie le receiveur a chaque fois (a verifier)

Stef

On Jul 7, 2011, at 10:21 AM, laurent laffont wrote:

>
>
> 2011/7/7 Nicolas Becu <[hidden email]>
> Bonjour à tous,
>
> Premier post de ma part, bien que je vous lis depuis quelques temps.
> Je me présente donc. J'utilise smallTalk dans le cadre de
> développement de modèles de simulation appliqués à la gestion du
> territoire, bien souvent en m'appuyant sur la plateforme de
> modélisation multi-agents Cormas.
> J'aurai une question qui va certainement vous sembler toute bête.
>
> Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
> Collection ?
> Ex. je veux obtenir un set rassemblant les éléments des array suivant
> #(4 5 8) #(7 1 2) #(45 2 96)
> Actuellement je créé une nouvelle instante Set new. Puis je fais trois
> addAll:
> Mais je me demande s'il n'y a pas plus "élégant".
>
> Salut,
>
> le premier truc qui me vient à l'esprit:
>
> (#(4 5 8), #(7 1 2), #(45 2 96)) asSet
>
> Laurent Laffont - @lolgzs
>
> Pharo Smalltalk Screencasts: http://www.pharocasts.com/
> Blog: http://magaloma.blogspot.com/
> Developer group: http://cara74.seasidehosting.st
>
>  
>
> Merci d'avance pour vos avis éclairés
>
> Nicolas Becu
> Chercheur au CNRS, UMR ProdiG
> http://www.prodig.cnrs.fr/
>

Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

Pottier Bernard
In reply to this post by laurent laffont
Le 07/07/2011 10:21, laurent laffont a écrit :


2011/7/7 Nicolas Becu <[hidden email]>
Bonjour à tous,

Premier post de ma part, bien que je vous lis depuis quelques temps.
Je me présente donc. J'utilise smallTalk dans le cadre de
développement de modèles de simulation appliqués à la gestion du
territoire, bien souvent en m'appuyant sur la plateforme de
modélisation multi-agents Cormas.
J'aurai une question qui va certainement vous sembler toute bête.

Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
Collection ?
Ex. je veux obtenir un set rassemblant les éléments des array suivant
#(4 5 8) #(7 1 2) #(45 2 96)
Actuellement je créé une nouvelle instante Set new. Puis je fais trois
addAll:
Mais je me demande s'il n'y a pas plus "élégant".

Bonjour,

Un petit exo de programmation pour finir la journée ?

Voilà une version récursive qui viendra à bout de tableaux de tableaux de ..

array := #(#(4 5 8) #(7 1 2) #(45 2 ( 44 12) 96)).
setForAll := Set new.
recurse := [ :element |
    ( element isKindOf: Array ) ifTrue: [ 
        element do: [ :value | recurse value: value]]
            ifFalse: [ setForAll add: element ]].
recurse value: array.
^setForAll


Cordialement
Bernard Pottier


Salut,

le premier truc qui me vient à l'esprit:

(#(4 5 8), #(7 1 2), #(45 2 96)) asSet

Laurent Laffont - @lolgzs

Pharo Smalltalk Screencasts: http://www.pharocasts.com/
Blog: http://magaloma.blogspot.com/
 

Merci d'avance pour vos avis éclairés

Nicolas Becu
Chercheur au CNRS, UMR ProdiG
http://www.prodig.cnrs.fr/


Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

Nicolas Becu
In reply to this post by cedreek
Merci pour les tuyaux

Plus précisément il s'agissait de former un set des instances des sous
classes d'une classe donnée. Du coup je voyais pas comment utiliser la
concaténation   ,  (d'ailleurs merci je savais pas qu'on pouvait
l'employé pour des tableaux) et je suis financement rester sur addAll:

ça donne ça
| aSet |
aSet := Set new.
MaClasse subclasses do: [:sb | aSet addAll: sb allInstances].


merci à tous,

Nicolas
On 7 juil, 10:29, Cédrick Béler <[hidden email]> wrote:

> Bonjour et bienvenue,
>
> addAll: me semble très élégant :)
> En Smalltalk, le choix d'algo n'est pas souvent une priorité. De plus il ne s'agit pas vraiment de fusion de collection. La question se poserait éventuellement si tu devais créer des ensembles de tres grande tailles, ou si les tableaux contenait beaucoup d'éléments en doublons (et toujours de grande taille). Sinon addAll: est suffisant pour moi.
>
> Sinon, comme alternative, tu peux aussi utiliser la méthode de classe newFrom:
>
> Set newFrom: anArray1 , anArray2 , anArray3
>
> ou encore
>
> (anArray1 , anArray2 , anArray3) asSet
>
> Dans tous les cas, si tu as des besoins de performances, utilises le Profiler ou simplement timeToRun
>
> [10000 timesRepeat: [Set newFrom: anArray1 , anArray2 , anArray3]] timeToRun     "print it"
> [10000 timesRepeat: [ ((Set newFrom: anArray1) addAll: anArray2 ;  yourself; addAll: anArray3]] timeToRun
> ...
>
> Cédrick
>
> Le 7 juil. 2011 à 10:18, Nicolas Becu a écrit :
>
>
>
>
>
>
>
> > Bonjour à tous,
>
> > Premier post de ma part, bien que je vous lis depuis quelques temps.
> > Je me présente donc. J'utilise smallTalk dans le cadre de
> > développement de modèles de simulation appliqués à la gestion du
> > territoire, bien souvent en m'appuyant sur la plateforme de
> > modélisation multi-agents Cormas.
> > J'aurai une question qui va certainement vous sembler toute bête.
>
> > Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
> > Collection ?
> > Ex. je veux obtenir un set rassemblant les éléments des array suivant
> > #(4 5 8) #(7 1 2) #(45 2 96)
> > Actuellement je créé une nouvelle instante Set new. Puis je fais trois
> > addAll:
> > Mais je me demande s'il n'y a pas plus "élégant".
>
> > Merci d'avance pour vos avis éclairés
>
> > Nicolas Becu
> > Chercheur au CNRS, UMR ProdiG
> >http://www.prodig.cnrs.fr/
Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

Nicolas Becu
In reply to this post by cedreek
Merci pour les tuyaux
Plus précisément il s'agissait de former un set comportant les
instances des sous
classes d'une classe donnée. Du coup je voyais pas comment utiliser
la
concaténation   ,  (d'ailleurs merci je ne savais pas qu'on pouvait
l'employer avec des tableaux) et je suis finalement  resté sur
addAll:
ça donne ça
| aSet |
aSet := Set new.
MaClasse subclasses do: [:sb | aSet addAll: sb allInstances].
merci à tous,
Nicolas

On 7 juil, 10:29, Cédrick Béler <[hidden email]> wrote:

> Bonjour et bienvenue,
>
> addAll: me semble très élégant :)
> En Smalltalk, le choix d'algo n'est pas souvent une priorité. De plus il ne s'agit pas vraiment de fusion de collection. La question se poserait éventuellement si tu devais créer des ensembles de tres grande tailles, ou si les tableaux contenait beaucoup d'éléments en doublons (et toujours de grande taille). Sinon addAll: est suffisant pour moi.
>
> Sinon, comme alternative, tu peux aussi utiliser la méthode de classe newFrom:
>
> Set newFrom: anArray1 , anArray2 , anArray3
>
> ou encore
>
> (anArray1 , anArray2 , anArray3) asSet
>
> Dans tous les cas, si tu as des besoins de performances, utilises le Profiler ou simplement timeToRun
>
> [10000 timesRepeat: [Set newFrom: anArray1 , anArray2 , anArray3]] timeToRun     "print it"
> [10000 timesRepeat: [ ((Set newFrom: anArray1) addAll: anArray2 ;  yourself; addAll: anArray3]] timeToRun
> ...
>
> Cédrick
>
> Le 7 juil. 2011 à 10:18, Nicolas Becu a écrit :
>
>
>
>
>
>
>
> > Bonjour à tous,
>
> > Premier post de ma part, bien que je vous lis depuis quelques temps.
> > Je me présente donc. J'utilise smallTalk dans le cadre de
> > développement de modèles de simulation appliqués à la gestion du
> > territoire, bien souvent en m'appuyant sur la plateforme de
> > modélisation multi-agents Cormas.
> > J'aurai une question qui va certainement vous sembler toute bête.
>
> > Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
> > Collection ?
> > Ex. je veux obtenir un set rassemblant les éléments des array suivant
> > #(4 5 8) #(7 1 2) #(45 2 96)
> > Actuellement je créé une nouvelle instante Set new. Puis je fais trois
> > addAll:
> > Mais je me demande s'il n'y a pas plus "élégant".
>
> > Merci d'avance pour vos avis éclairés
>
> > Nicolas Becu
> > Chercheur au CNRS, UMR ProdiG
> >http://www.prodig.cnrs.fr/
Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

cedreek
ou sinon:

MyClass allSubInstances

;-)

a priori, il ne doit pas y avoir de doublons.

Cédrick

Le 8 juil. 2011 à 10:51, Nicolas Becu a écrit :

> Merci pour les tuyaux
> Plus précisément il s'agissait de former un set comportant les
> instances des sous
> classes d'une classe donnée. Du coup je voyais pas comment utiliser
> la
> concaténation   ,  (d'ailleurs merci je ne savais pas qu'on pouvait
> l'employer avec des tableaux) et je suis finalement  resté sur
> addAll:
> ça donne ça
> | aSet |
> aSet := Set new.
> MaClasse subclasses do: [:sb | aSet addAll: sb allInstances].
> merci à tous,
> Nicolas
>
> On 7 juil, 10:29, Cédrick Béler <[hidden email]> wrote:
>> Bonjour et bienvenue,
>>
>> addAll: me semble très élégant :)
>> En Smalltalk, le choix d'algo n'est pas souvent une priorité. De plus il ne s'agit pas vraiment de fusion de collection. La question se poserait éventuellement si tu devais créer des ensembles de tres grande tailles, ou si les tableaux contenait beaucoup d'éléments en doublons (et toujours de grande taille). Sinon addAll: est suffisant pour moi.
>>
>> Sinon, comme alternative, tu peux aussi utiliser la méthode de classe newFrom:
>>
>> Set newFrom: anArray1 , anArray2 , anArray3
>>
>> ou encore
>>
>> (anArray1 , anArray2 , anArray3) asSet
>>
>> Dans tous les cas, si tu as des besoins de performances, utilises le Profiler ou simplement timeToRun
>>
>> [10000 timesRepeat: [Set newFrom: anArray1 , anArray2 , anArray3]] timeToRun     "print it"
>> [10000 timesRepeat: [ ((Set newFrom: anArray1) addAll: anArray2 ;  yourself; addAll: anArray3]] timeToRun
>> ...
>>
>> Cédrick
>>
>> Le 7 juil. 2011 à 10:18, Nicolas Becu a écrit :
>>
>>
>>
>>
>>
>>
>>
>>> Bonjour à tous,
>>
>>> Premier post de ma part, bien que je vous lis depuis quelques temps.
>>> Je me présente donc. J'utilise smallTalk dans le cadre de
>>> développement de modèles de simulation appliqués à la gestion du
>>> territoire, bien souvent en m'appuyant sur la plateforme de
>>> modélisation multi-agents Cormas.
>>> J'aurai une question qui va certainement vous sembler toute bête.
>>
>>> Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
>>> Collection ?
>>> Ex. je veux obtenir un set rassemblant les éléments des array suivant
>>> #(4 5 8) #(7 1 2) #(45 2 96)
>>> Actuellement je créé une nouvelle instante Set new. Puis je fais trois
>>> addAll:
>>> Mais je me demande s'il n'y a pas plus "élégant".
>>
>>> Merci d'avance pour vos avis éclairés
>>
>>> Nicolas Becu
>>> Chercheur au CNRS, UMR ProdiG
>>> http://www.prodig.cnrs.fr/

Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

Jean-François LEFEVRE-3
In reply to this post by Nicolas Becu
Bonjour,

Dans ce cas, ça parait bizarre de prendre uniquement les sous-classes
directes et pas récursivement les sous-classes de toute la hiérarchie.
VisualWorks te propose deux méthodes qui sembleraient plus appropriées
pour ton problème.

- Behavior>allGeneralInstances
   retourne la collection des instances de tous les "sous-behaviors"

- Behavior>allGeneralInstancesDo: aBlock
  effectue un traitement sur ces instances (plus optimal car on ne
maintient pas la collection complète, on ne fait que parcourir les
instances)

Après, tout dépend du traitement que tu veux faire ensuite avec ces instances.
Si tu veux faire un traitement sur chaque instance, le
allGeneralInstancesDo: est probablement le plus élégant et efficace

Si tu veux vraiment éliminer les "doublons" (éliminer les instances
qui sont "=") ce que suggère ta volonté d'utiliser un Set, alors
    MaClasse allGeneralInstances asSet
 est probablement le plus élégant mais pas le plus performant (on
parle de microsecondes quand même !!!) car cela construit un gros
tableau pour en faire ensuite un Set plus petit.

aSet := Set new: 10.  "<-indiquer ici une taille plausible du nombre
d'instances final"
MaClasse allGeneralInstancesDo: [:each | aSet add: each].

est probablement un bon compromis entre élégance et performance.

Bon weekend à tous
Jean-François

Le 8 juillet 2011 10:51, Nicolas Becu <[hidden email]> a écrit :

> Merci pour les tuyaux
> Plus précisément il s'agissait de former un set comportant les
> instances des sous
> classes d'une classe donnée. Du coup je voyais pas comment utiliser
> la
> concaténation   ,  (d'ailleurs merci je ne savais pas qu'on pouvait
> l'employer avec des tableaux) et je suis finalement  resté sur
> addAll:
> ça donne ça
> | aSet |
> aSet := Set new.
> MaClasse subclasses do: [:sb | aSet addAll: sb allInstances].
> merci à tous,
> Nicolas
>
> On 7 juil, 10:29, Cédrick Béler <[hidden email]> wrote:
>> Bonjour et bienvenue,
>>
>> addAll: me semble très élégant :)
>> En Smalltalk, le choix d'algo n'est pas souvent une priorité. De plus il ne s'agit pas vraiment de fusion de collection. La question se poserait éventuellement si tu devais créer des ensembles de tres grande tailles, ou si les tableaux contenait beaucoup d'éléments en doublons (et toujours de grande taille). Sinon addAll: est suffisant pour moi.
>>
>> Sinon, comme alternative, tu peux aussi utiliser la méthode de classe newFrom:
>>
>> Set newFrom: anArray1 , anArray2 , anArray3
>>
>> ou encore
>>
>> (anArray1 , anArray2 , anArray3) asSet
>>
>> Dans tous les cas, si tu as des besoins de performances, utilises le Profiler ou simplement timeToRun
>>
>> [10000 timesRepeat: [Set newFrom: anArray1 , anArray2 , anArray3]] timeToRun     "print it"
>> [10000 timesRepeat: [ ((Set newFrom: anArray1) addAll: anArray2 ;  yourself; addAll: anArray3]] timeToRun
>> ...
>>
>> Cédrick
>>
>> Le 7 juil. 2011 à 10:18, Nicolas Becu a écrit :
>>
>>
>>
>>
>>
>>
>>
>> > Bonjour à tous,
>>
>> > Premier post de ma part, bien que je vous lis depuis quelques temps.
>> > Je me présente donc. J'utilise smallTalk dans le cadre de
>> > développement de modèles de simulation appliqués à la gestion du
>> > territoire, bien souvent en m'appuyant sur la plateforme de
>> > modélisation multi-agents Cormas.
>> > J'aurai une question qui va certainement vous sembler toute bête.
>>
>> > Quel algo vous semble le plus adéquate "fusionner" (merge) plusieurs
>> > Collection ?
>> > Ex. je veux obtenir un set rassemblant les éléments des array suivant
>> > #(4 5 8) #(7 1 2) #(45 2 96)
>> > Actuellement je créé une nouvelle instante Set new. Puis je fais trois
>> > addAll:
>> > Mais je me demande s'il n'y a pas plus "élégant".
>>
>> > Merci d'avance pour vos avis éclairés
>>
>> > Nicolas Becu
>> > Chercheur au CNRS, UMR ProdiG
>> >http://www.prodig.cnrs.fr/

--
Jean-François LEFEVRE
Consultant / Formateur
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: algo pour fusionner des collections

Damien Cassou
2011/7/8 Jean-François LEFEVRE <[hidden email]>:
> - Behavior>allGeneralInstances
>   retourne la collection des instances de tous les "sous-behaviors"
>
> - Behavior>allGeneralInstancesDo: aBlock
>  effectue un traitement sur ces instances (plus optimal car on ne
> maintient pas la collection complète, on ne fait que parcourir les
> instances)

En Pharo et probablement Squeak, tu as #allSubInstances et #allSubInstancesDo:

--
Damien Cassou
http://damiencassou.seasidehosting.st

"Lambdas are relegated to relative obscurity until Java makes them
popular by not having them." James Iry