2017-03-01 42 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. 
相關問題