Arrays 读取数组中的字符串并在Smalltalk中将其转换为数组
我正在尝试读取一个包含单词集的文本文件,并将它们转换为一个集合。我首先做的是,每当有马车返回时,我就把单词分开,将它们分组。我成功地将它存储在一个数组中。我想做的下一件事是读取字符串数组内容,并通过在数组中将单词分隔成一个数组来再次分组。可能吗?希望你能帮助我。谢谢 我尝试循环当前集合,并放置一些条件来修剪空白,并将它们放入数组中的新集合中,但它不起作用 以下是我迄今为止所做的工作: 语法:Arrays 读取数组中的字符串并在Smalltalk中将其转换为数组,arrays,oop,object,smalltalk,Arrays,Oop,Object,Smalltalk,我正在尝试读取一个包含单词集的文本文件,并将它们转换为一个集合。我首先做的是,每当有马车返回时,我就把单词分开,将它们分组。我成功地将它存储在一个数组中。我想做的下一件事是读取字符串数组内容,并通过在数组中将单词分隔成一个数组来再次分组。可能吗?希望你能帮助我。谢谢 我尝试循环当前集合,并放置一些条件来修剪空白,并将它们放入数组中的新集合中,但它不起作用 以下是我迄今为止所做的工作: 语法: | fileName fileRead values | fileName := 'fruitVendo
| fileName fileRead values |
fileName := 'fruitVendor.txt'.
fileRead := fileName asFilename readStream.
fileValues := OrderedCollection new.
arrValues := OrderedCollection new.
[(string := fileRead upTo: Core.Character cr) isEmpty]
whileFalse: [fileValues addLast: string].
param := fileValues asArray.
param do:
[:ea |
stream := ReadStream on: ea.
[(arrString := stream upTo: Core.Character space) isEmpty]
whileFalse: [arrValues addLast: arrString].]
以下是该文件的内容:
fruitVendor.txt
China Beijing Apple //cr
Hawaii Honolulu Pineapple //cr
Japan Tokyo Banana //cr
Vietnam Ho chi min Pear
输出应为:
#(#('China' 'Beijing' 'Apple')#('Hawaii' 'Honolulu' ''Pineapple)#('Japan' 'Tokyo' 'Banana')#('Vietnam' 'Ho chi min' 'Pear'))
我正在努力实现的目标:
将数组中的字符串存储到数组本身中的新数组中,更像字节数组。您希望将第一个集合中的每个元素(行字符串)转换为基于原始数组的不同元素(字数组)。这就是收集的
collect:
消息的目的
arrValues := fileValues collect:
[:each | | inner |
inner := OrderedCollection new.
stream := ReadStream on: each.
[(word := stream upTo: Core.Character space) isEmpty]
whileFalse: [inner addLast: word].
inner asArray "<-- this is the answer value of this block"]
arrValues:=文件值收集:
[:每个| |内部|
内部:=OrderedCollection新建。
流:=每个上的ReadStream。
[(字:=流到:Core.Character space)isEmpty]
whileFalse:[内部addLast:word]。
inner asArray“正如@JayK向您展示的更通用的方式(它不处理“胡志明”
)一样,我冒昧地用了更多的“闲聊”方式
我所有的例子都在使用。我会尝试用自然的方式来做,人们会如何看待这样一个问题
首先想到的是通过空格(一个空格字符空间
)将其拆分。第二个示例中,三个是一个名为#splitBy:
和#splitByAll:
的便捷选择器
因此,我们尝试:
| readFileStream citiesCollection |
readFileStream := 'C:\t\so\smalltalk\fruitVendor_space.txt' asFilename readStream.
citiesCollection := OrderedCollection new.
readFileStream linesDo: [ :eachLine |
| cities |
cities := (eachLine splitBy: Character space) select: [ :eachCity | eachCity notEmpty ].
citiesCollection add: cities asArray
].
citiesCollection inspect
结果可能不是您预期的结果,因为最后一个数组是:
这是因为您在字符串“胡志明”中有一个空格
有办法解决吗?在您的场景中有。让我们使用两个空格来分割它,而不仅仅是一个:
| readFileStream citiesCollection spitCollection |
readFileStream := 'C:\t\so\smalltalk\fruitVendor_space.txt' asFilename readStream.
citiesCollection := OrderedCollection new.
spitCollection := OrderedCollection new.
2 timesRepeat: [ spitCollection add: (Character space) ]. "/ adding two spaces
readFileStream linesDo: [ :eachLine |
| cities |
cities := (eachLine splitByAll: spitCollection) select: [ :eachCity | eachCity notEmpty ].
cities := cities copy collect: [ :eachCity | eachCity withoutSpaces ].
citiesCollection add: cities asArray
].
citiesCollection inspect.
现在我们得到了城市字符串的正确结果
#(“越南”、“胡志明”、“梨”)
尽管如此,我认为(在现实生活中)最可取的方法是使用某种拆分器(如$;
(;
字符)在源文件处进行拆分,类似于csv
文件,但使用;
)。(没有人说将来你会有两个空格来分割它-所以你需要一个分割器来定义字符串的结尾-这可能是csv产生的主要原因)
源文件将是:
China; Beijing; Apple;
Hawaii; Honolulu; Pineapple;
Japan; Tokyo; Banana;
Vietnam; Ho chi min; Pear;
然后,代码看起来与上面的第一个代码类似:
| readFileStream citiesCollection |
readFileStream := 'C:\t\so\smalltalk\fruitVendor.txt' asFilename readStream.
citiesCollection := OrderedCollection new.
readFileStream linesDo: [ :eachLine |
| cities |
cities := (eachLine splitBy: $;) collect: [ :eachCity | eachCity withoutSpaces ].
citiesCollection add: cities asArray
].
citiesCollection inspect.
我看到的唯一问题是你忘了关闭文件流。顺便问一下,你的问题是什么?我想你会面临“胡志明”这个被空间分割的城市的问题。