【发布时间】:2018-07-04 17:43:40
【问题描述】:
Smalltalk 的实现似乎错过了返回字符串中子字符串的所有索引的算法。最相似的只返回一个元素的一个索引,例如:firstIndexesOf:in:、findSubstring:、findAnySubstring: variables。
有implementations in Ruby,但第一个依赖于 Ruby hack,第二个无法忽略重叠字符串,最后一个使用 Enumerator 类,我不知道如何将其转换为 Smalltalk。我想知道这个Python implementation 是否是最好的开始路径,因为考虑了这两种情况,重叠与否,并且不使用正则表达式。
我的目标是找到提供以下行为的包或方法:
'ABDCDEFBDAC' indicesOf: 'BD'. "#(2 8)"
考虑重叠时:
'nnnn' indicesOf: 'nn' overlapping: true. "#(0 2)"
当不考虑重叠时:
'nnnn' indicesOf 'nn' overlapping: false. "#(0 1 2)"
在 Pharo 中,当在 Playground 中选择文本时,扫描仪会检测子字符串并突出显示匹配项。但是我找不到这个的 String 实现。
到目前为止,我尽最大努力在 String (Pharo 6) 中实现了这个实现:
indicesOfSubstring: subString
| indices i |
indices := OrderedCollection new: self size.
i := 0.
[ (i := self findString: subString startingAt: i + 1) > 0 ] whileTrue: [
indices addLast: i ].
^ indices
【问题讨论】:
-
我可以鼓励您(尝试)自己实现该方法吗? SO 规则规定问题应该表现出一些编码工作;给我们看看你的。
-
您的
overlappling: true与overlapping: false的示例结果似乎相反? -
当您对答案感到满意时,请不要忘记标记您的问题已回答!更多信息见stackoverflow.com/help/someone-answers
标签: string smalltalk pharo visualworks dolphin-smalltalk