我有一个问题,这是我在代码中调用一个方法时的结果。
t do:[:i |
dict := Dictionary newFrom:{t->items}.
].
t是
OrderedCollection(#name #lastName #birthDate)
以及项目。items an OrderedCollection('cs0yh1n1b2bm0wps16uvy7tfi' 'cs0yh1k1t3bgdszfupe407qdg' 21 April 1975)
a Dictionary [1 item] (an OrderedCollection(#name #lastName #birthDate)->an OrderedCollection('cs0yh1n1b2bm0wps16uvy7tfi' 'cs0yh1k1t3bgdszfupe407qdg' 21 April 1975).
我想要一本性别词典
a Dictionary (#name->'cs0yh1n1b2bm0wps16uvy7tfi' #lastNamename->'cs0yh1k1t3bgdszfupe407qdg' #birthDay->21 April 1975)
请问我该怎么做?
每次循环都要创建一个新的Dictionary。您需要在循环之前创建一个新的(空的(Dictionary,并使用#'at:put:'
添加每个元素。如果要将t
中的索引1映射到items
中的索引,则需要有一个计数器。也许1 to: t size do: [:i | ...]
。
你问了很多关于Smalltalk的问题,我们很高兴你能学习它。你有没有试过花几个小时学习一本书或参加一门课程?我推荐Pharo Mooc,一些Pharo的书,或者一些Smalltalk的书。
TL;DR 让我再次重申Pharo By Example(PBE(很长很详细,通过它你会学到很多东西。
也就是说,当你刚开始的时候,有时一个明确的答案更容易理解。因此,这里有一个更明确的解决方案来解决您的问题。但是,请注意,此代码有一个主要弱点,即keys
阵列的大小必须等于或小于values
阵列的大小。如果不是这样,坏事就会发生。
keys := #(#name #lastName #birthDate).
values := #('cs0yh1n1b2bm0wps16uvy7tfi' 'cs0yh1k1t3bgdszfupe407qdg' '21 April 1975').
myDict := Dictionary new.
1 to: ( keys size) do: [ :item | myDict at: ( keys at:item ) put: (values at:item ) ].
在本例中,您从#((构造中获得的Array
与OrderedCollection
同样有效。如果OrderedCollection
对您很重要,并且您需要一个使用该Object的解决方案,则可以将前两行替换为:
keys := OrderedCollection withAll: #(#name #lastName #birthDate).
values := OrderedCollection withAll: #('cs0yh1n1b2bm0wps16uvy7tfi' 'cs0yh1k1t3bgdszfupe407qdg' '21 April 1975').
您在代码中遗漏的关键信息是,您有两个可索引的集合,因此您必须通过对这两个集合进行索引来解决问题。
代码的另一个问题是每次迭代都要重写字典。
dict := Dictionary newFrom:{t->items}.
最后:有这个解决方案。
myData := Dictionary newFrom: {#name->'cs0yh1n1b2bm0wps16uvy7tfi'. #lastName->'cs0yh1k1t3bgdszfupe407qdg'. #birthDate->'21 April 1975'}
注意:在每个关联的末尾都有一个。它将关联分离,并使其成为三个元素的列表。
我唯一简化了这个问题的地方是,我接受了你1975年4月21日使用Date的尝试,并将其转换为字符串。只是因为在示例中不包含日期构造更简单。