Smalltalk 集合中元素的共现
我有一个字符串数组,比如Smalltalk 集合中元素的共现,smalltalk,pharo,idioms,Smalltalk,Pharo,Idioms,我有一个字符串数组,比如 #(#('smalltalk' 'pharo' 'cool') #('smalltalk' 'pharo' 'new') #('smalltalk' 'cool')) 并且要计算不同集合中字符串的共现率,因此我将获得以下信息: smalltalk,pharo,2 smalltalk,酷,2 smalltalk,新,1 法罗,酷,1 法罗,新,1 酷、新、0(可选出现0次) Smalltalk(Pharo)收集方法收集这些数据最惯用的方法是什么?(结果可以存储在
#(#('smalltalk' 'pharo' 'cool')
#('smalltalk' 'pharo' 'new')
#('smalltalk' 'cool'))
并且要计算不同集合中字符串的共现率,因此我将获得以下信息:
smalltalk,pharo,2smalltalk,酷,2
smalltalk,新,1
法罗,酷,1
法罗,新,1
酷、新、0(可选出现0次) Smalltalk(Pharo)收集方法收集这些数据最惯用的方法是什么?(结果可以存储在带有element1、element2和count变量的简单对象中。)
我可以想出一些简单的解决方案,但与过去的类似问题一样,我发现我错过了一个漂亮的Smalltalk解决方案,而是做了一些愚蠢的循环。这也出现了相反的情况,但我对此没有意见。
在我看来,它非常清晰,现在的问题是,如果它是有效的:
|source bagOfPairs|
source := #(#('smalltalk' 'pharo' 'cool')
#('smalltalk' 'pharo' 'new')
#('smalltalk' 'cool')).
bagOfPairs := Bag new.
source do: [ :each |
each allPairsDo: [:first :second |
(first = second) ifFalse: [bagOfPairs add: {first . second}]
].
].
bagOfPairs inspect.
我看不到任何惯用的操作,这是一个相对复杂的操作,我将分解为这些操作(原型代码): 如果您想按计数排序,那么它只是另一个排序方式:#value 如果只打印但不收集:,则可以在do: 它仍然需要实现flatteAllegements to:(简单,类似于展平资产)和generateAllPairsDo(或者某种allPairsDo:如果您只是打印,则有SequenceableCollection>>#组合:atATimeDo:对于此任务来说足够方便)
你想出了什么解决办法?你提到它很简单,但是你怎么会认为它不是惯用语呢?啊,但是你没有得到你最初问的0次出现次数?是的,我改变了问题,因为对于我的真实世界问题,我可以不出现0次。但对于堆栈溢出来说,这可能不是一个好主意。我真的很喜欢你的回答,谢谢!请注意,这回答了要求0次出现的初始问题(酷,新,0)是的,我更改了问题,因为我的真实世界问题可以没有0次出现。但对于堆栈溢出来说,这可能不是一个好主意。我真的很喜欢你的回答,谢谢!我将0个事件作为可选项放回问题。
countAssociatedPairsIn aCollection
| set pairs |
set := aCollection flattenAllElementsInto: Set new.
pairs := set generateAllPairs.
^pairs collect: [:pair | pair -> (aCollection count: [:associations | associations includesAll: pair])]
countAssociatedPairsIn aCollection
| items |
items:= aCollection flattened asSet asArray sorted.
items combinations: 2 atATimeDo: [:pair |
Transcript cr;
print: pair; nextPutAll: '->';
print: (aCollection count: [:associations | associations includesAll: pair]);
flush]