gpt4 book ai didi

arrays - 在 Smalltalk 中读取数组中的字符串并将其转换为数组

转载 作者:行者123 更新时间:2023-12-02 08:39:09 29 4
gpt4 key购买 nike

我正在尝试读取包含单词集的文本文件并将它们转换为集合。我首先做的是,只要有回车符,我就通过将它们分开来对单词进行分组。我成功地将它存储在数组中。我想做的下一件事是读取字符串数组内容,并通过将它们分成数组内的数组来再次对单词进行分组。是否可以?希望你能帮助我。谢谢!

我尝试循环当前集合并放置一些条件来修剪空格并将它们放入数组内的新集合中,但它不起作用。

这是我到目前为止所做的事情:

语法:

| 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'))

我想要实现的目标:

将数组内的字符串存储到数组本身内的新数组中,更像是字节数组。

最佳答案

我冒昧地以更“闲聊”的方式来做这件事,因为 @JayK 向您展示了更通用的方式(它不处理'Ho chi min'问题)。

我所有的例子都使用 Smalltalk/X-jv 。我会尝试以自然的方式来做这件事,人们会如何看待这样的问题。

首先想到的是通过空格“仅仅”分割它(一个空格字符空间)。第三个是这样一个方便的选择器,名为 #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

结果可能不是你所期望的,因为最后一个数组是:

#('越南' 'Ho' 'chi' 'min' '梨')

这是因为字符串 'Ho chi min' city 中有一个空格。

有办法解决吗?在你的场景中有。让我们使用两个空格而不是一个来分割它:

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

现在我们得到了'Ho chi min'城市字符串的正确结果。

#('越南' '胡志明' '梨')

综上所述,我认为(在现实生活中)最可取的方法是使用某种拆分器(例如 $; (; 字符) - 类似于 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.

关于arrays - 在 Smalltalk 中读取数组中的字符串并将其转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780380/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com