我正在学习smalltalk,我正在尝试创建一个非常简单的程序,创建一个数字数组,然后找到最大的数字。我的代码如下所示:
| list max |
list := #(1 8 4 5 3).
1 to: list size do: [:i |
max < (list at: i)
ifTrue: [max := (list at: i)].
ifFalse: [max := max].
].
当我运行此代码时,我得到“stdin:7:解析错误,预期']'”。我对这导致什么感到困惑。它看起来像我的所有方括号对应。帮助
答案 0 :(得分:5)
亚历山大告诉你,很可能该集合提供了一种最大方法。您可能会对如何操作感兴趣。
使用collection max(所有元素的最大值)
#(1 8 4 5 3) max
使用数字最大值:(两个数字中的哪一个更大)
#(1 8 4 5 3) inject: 0 into: [:max :elem|
max max: elem ]
或仅使用内部迭代器
#(1 8 4 5 3) inject: 0 into: [:max :elem|
max < elem
ifTrue: [ elem ]
ifFalse:[ max ] ]
与您使用外部迭代的解决方案一起,您可以看到有很多可能性。
希望它增加一些东西
答案 1 :(得分:4)
行号似乎已关闭,但查看您的代码似乎错误可能是由ifTrue: [max := (list at: i)]
之后的时段引起的。 #ifTrue:ifFalse
是一个单一的方法选择器,将它分成两个语句是没有意义的。
实际上,您可以完全删除代码的ifFalse
部分。为自己分配最大值无效。此处不需要循环索引。您可以使用list do: […]
直接处理这些值。
还应初始化max变量。零似乎是与数组中的正数进行比较的好选择。
但不是做所有调查Collection类。您的Smalltalk方言可能已经为此任务提供max
方法。
答案 2 :(得分:3)
您的立即问题是您使用句点终止ifTrue
部分。您通常可以删除句点,但由于您的ifFalse
部分实际上是非操作,因此最好删除该位。
但即使你修复了这个问题,你仍然需要初始化max
,这样就不会向<
对象发送nil
消息。您可以将其初始化为第一个元素,如果有,则可以将循环更改为从第二个元素开始。
当然,当列表为空时初始化到第一个元素是有问题的,所以你也应该处理它。在下面的代码中,我将它设置为一个合适的小值,然后只有在它可用时才从列表的第一个元素初始化它。
更正后的代码是:
| list max |
list := #(1 8 4 5 3).
max := -99999.
(list size) > 0 ifTrue: [max := (list at: 1)].
2 to: list size do: [:i |
max < (list at: i) ifTrue: [max := (list at: i)].
]
(max) displayNl
这会按预期输出8
,也可以在边缘情况下正常工作(列表大小为零和一)。