如何计算Smalltalk中已处理字符串的数量?

时间:2017-03-01 16:17:32

标签: string count smalltalk

我的程序计算已处理字符串的字母数。我也想计算字符串的数量,但我不知道如何,我还没有在谷歌找到任何有用的东西。谢谢你的耐心等待。

|s b|
b := Bag new.

[s := stdin nextLine. s ~= 'exit'] whileTrue: [
    s do: [:c |
        b add: c.
    ].
].

b displayNl.

2 个答案:

答案 0 :(得分:2)

据我所知,你想要计算一组字符串中字母的出现次数。首先,我建议你在客户输入时不要这样做(除非你真的需要立即做出反应)。

现在假设您将所有输入收集到名为input的变量中。要获取事件,您可以执行input asBag,这会将字符串(字符集合转换为包)。所以现在你完成了第一个任务。那么这取决于你认为什么是一个词。例如,您可以使用input substrings使用空格(制表符,空格,换行符等)作为分隔符将大字符串分解为小字符串。否则,您可以使用input substrings: ','指定要使用的分隔符(在示例中为逗号)。现在,要计算字符串中单词的出现次数,您可以使用input substrings asBag

当然,如果您想在用户输入数据时执行此操作,您可以执行以下操作:

|line characters words|
characters := Bag new.
words := Bag new.

[ line := stdin nextLine. line ~= 'exit'] whileTrue: [
   characters addAll: line.
   words addAll: line substrings
].

characters displayNl.
words displayNl

答案 1 :(得分:1)

如果你想计算从stdin读取的行数,你可以像任何命令式语言一样:使用计数器。

| numberOfLines s |
numberOfLines := 0.
[s := stdin nextLine. s ~= 'exit'] whileTrue: [
    numberOfLines := numberOfLines + 1.
    "..."].
numberOfLines displayNl.

或者,按照Uko的回答,将所有行收集到另一个集合中,然后使用其大小:

| lines s |
lines := OrderedCollection new.
[s := stdin nextLine. s ~= 'exit'] whileTrue: [lines add: s. "..."].
lines size displayNl.