Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 读取数组中的字符串并在Smalltalk中将其转换为数组_Arrays_Oop_Object_Smalltalk - Fatal编程技术网

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.

我看到的唯一问题是你忘了关闭文件流。顺便问一下,你的问题是什么?我想你会面临“胡志明”这个被空间分割的城市的问题。