在 Pharo 11.0 中使用数组时出现问题

问题描述 投票:0回答:1

我正在开发一个名为

Boggle
的类,其中包含以下两个类端方法:

search: board for: words 
  | result visited trie | 
  result := Dictionary new.
  trie := CTTrie new.
  words do: [:word | trie at: word put: word].
  visited := (1 to: board size) collect: [:i | 
    (1 to: board first size) collect: [:j | false].
  ].
  board doWithIndex: [:row :i | 
    row doWithIndex: [:char :j | 
      self 
        searchUtil: board 
        visited: visited 
        i: i 
        j: j 
        prefix: '' 
        final: Array new 
        result: result 
        trie: trie.
    ].
  ].
  ^result
  
searchUtil: board visited: visited i: i j: j prefix: prefix final: final result: result trie: trie 
    
  | newPrefix newFinal| 
  (visited at: i) at: j put: true. 
  newPrefix := prefix, ((board at: i) at: j) asString. 
  newFinal := final copyWith: i @ j. 
  Transcript show: '1'; cr. 
  Transcript show: 'newPrefix: ', newPrefix; cr. 
  Transcript show: 'newFinal: ', newFinal; cr. 
  (trie contains: newPrefix) ifTrue: [ 
    result at: newPrefix put: newFinal.
  ].
  Transcript show: '2'; cr. 
  Transcript show: 'result: ', result; cr.
  (i - 1) to: (i + 1) do: [ :row |
    (j - 1) to: (j + 1) do: [ :col |
      ((row between: 1 and: board size) and: [
        col between: 1 and: (board at: row) size]) ifTrue: [
          ((visited at: row) at: col) ifFalse: [
            Transcript show: '3'; cr.
            self
              searchUtil: board
              visited: visited
              i: row
              j: col
              prefix: newPrefix
              final: newFinal
              result: result
              trie: trie ] ] ] ].
    (visited at: i) at: j put: false

输入:

此方法的第一个参数是

board
,表示为元素为字符的数组的静态数组。例如,
#(#($e $a) #($s $t))
。第二个参数是一个字符串数组 (
words
),表示合法单词列表,例如
#(‘east’ ‘ate’ ‘john’ … )
等等。

输出:

search:for:
方法将返回一个字典。键将是该方法找到的单词,每个键的值将是一个点数组。每个点对应于棋盘中组成单词的相应字符的 2D 索引。

当我用下面的示例测试方法时,

Transcript clear. 
words := #('ea' 'eat' 'ate' 'east' 'sat' 'hello' 'girl' 'guy'). 
board := #( #( $e $a ) #( $s $t ) ). 
result := Dictionary new. 
result := Boggle search: board for: words. 
Transcript show: result; cr.

我收到此错误:

Error: Improper store into indexable object

显然问题在于

newFinal
数组未更新。
newFinal := final copyWith: i @ j
更新
newFinal
数组的值,
search:for:
方法中final的初始值已设置为
Array new
,这会产生一个空数组。

Output from running the test

实际输出应该是

a Dictionary('ea'-\>#((1@1).(1@2)) 'eat'-\>#((1@1).(1@2).(2.2)) ...)

等等。

这就是我所能弄清楚的。非常感谢任何解决此问题的帮助。预先感谢。

arrays dictionary traversal smalltalk pharo
1个回答
0
投票

从你的堆栈看来,问题出在

,
运算符的参数上(你打算将其作为字符串连接。我怀疑问题出在这一行:

Transcript show: 'result: ', result; cr.

如果

result
不是字符串,那么它将尝试将字典存储到字符串中,给出“不正确的存储”错误。

© www.soinside.com 2019 - 2024. All rights reserved.