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,2
smalltalk,酷,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]