2017-03-01 64 views
1

我的程序计算处理的字符串的字母数。我也想计算字符串的数量,但我不知道如何,我还没有发现任何有用的东西在谷歌。谢谢你的耐心。我如何计算Smalltalk中处理字符串的数量?

|s b| 
b := Bag new. 

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

b displayNl. 
+0

你能提供一个例子输入和输出?你的问题有点不清楚。 –

+0

对不起我的坏。例如: 例如: 苹果伏特加啤酒 – George312

回答

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 
+2

我会补充说'字符addAll:line'是什么替代的做:[:c | b add:c]','s'扮演与'line'相同的角色。两者都是等价的,但第一个比较特殊。 –

1

如果你要算行数从标准输入读取,你可以这样做它像任何命令式语言一样:使用计数器。

| 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.