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/ |
2011/7/7 Nicolas Becu <[hidden email]> Bonjour à tous, Salut, le premier truc qui me vient à l'esprit: Laurent Laffont - @lolgzs Pharo Smalltalk Screencasts: http://www.pharocasts.com/ Blog: http://magaloma.blogspot.com/ Developer group: http://cara74.seasidehosting.st
|
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/ |
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 |
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/ > |
In reply to this post by laurent laffont
Le 07/07/2011 10:21, laurent laffont a écrit :
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
|
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/ |
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/ |
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/ |
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] |
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 |
Free forum by Nabble | Edit this page |