【问题标题】:Sorting array elements in Smalltalk在 Smalltalk 中对数组元素进行排序
【发布时间】:2020-01-07 07:24:01
【问题描述】:

我正在尝试通过评估数组的第一个和第三个元素,按字母顺序对数组的内容进行排序。我尝试使用数组中的第二个和第三个元素来评估和排序数组。但是我还是没能得到想要的结果。

这是收藏的内容

#(#('Philippines' 'Davao' 'Durian')
#('Philippines' 'Cebu' 'Mango')
#('Philippines' 'Zambales' 'Lanzones)
#('Thailand' 'Bangkok'  'Durian')
#('Thailand' 'Phuket' 'Mango')
#('Vietnam' 'Ho chi min' 'Banana')
#('Vietnam' 'Hanoi' 'Mango'))

这就是我所做的:

newArray := arrValues asArray.

newContent := newArray asSortedCollection: [ :ea :each | (ea at: 2) < (each at: 3) and: [ (ea at: 3) < (each at: 3)  ] ].

这是我的输出:

#(#('Vietnam' 'Ho chi min' 'Banana')
#('Thailand' 'Bangkok'  'Durian')
#('Philippines' 'Davao' 'Durian')
#('Vietnam' 'Hanoi' 'Mango'))
#('Thailand' 'Phuket' 'Mango')
#('Philippines' 'Zambales' 'Lanzones)
#('Philippines' 'Cebu' 'Mango')

输出应该是:

#(#('Vietnam' 'Ho chi min' 'Banana')
#('Thailand' 'Bangkok'  'Durian')
#('Philippines' 'Davao' 'Durian')
#('Philippines' 'Cebu' 'Mango')
#('Vietnam' 'Hanoi' 'Mango'))
#('Thailand' 'Phuket' 'Mango')
#('Philippines' 'Zambales' 'Lanzones)

【问题讨论】:

  • 您要求的输出(“输出应该是:”)未排序,因此实际上没有人可以给您一个与之匹配的正确答案。在每一列中你都有错误('Vietnam' 在'Thailand'之上,'Ho chi min' 在'Bankok'之上;'Mango' 在'Lanzones'之上)
  • @PeterUhnak no:这是因为第三个元素用作主要谓词,然后是第二个......
  • @PeterUhnak :) 我应该核实我上次咨询眼科医生的时间......

标签: arrays sorting oop object smalltalk


【解决方案1】:

输出应该是:

#(#('Vietnam' 'Ho chi min' 'Banana')
#('Thailand' 'Bangkok'  'Durian')
#('Philippines' 'Davao' 'Durian')
#('Philippines' 'Zambales' 'Lanzones)
#('Philippines' 'Cebu' 'Mango')
#('Vietnam' 'Hanoi' 'Mango'))
#('Thailand' 'Phuket' 'Mango')

要得到这个,你可以使用

newArray := arrValues asArray.

newContent := newArray asSortedCollection: 
    [ :ea :each |
      (ea at: 3) < (each at: 3)
         or: [ (ea at: 3) = (each at: 3) and: [(ea at: 2) < (each at: 2)] ]
    ].

或典型且可读性稍强的版本

newArray := arrValues asArray.

newContent := newArray asSortedCollection: 
    [ :a :b |
      (a at: 3) < (b at: 3)
         or: [ (a at: 3) = (b at: 3) and: [(a at: 2) < (b at: 2)] ]
    ]. 

【讨论】:

    【解决方案2】:

    在 Squeak 和 Pharo Smalltalk 中,您可以编写如下内容:

    ^arrValues sorted: #third ascending , #second ascending
    

    或在 Visualworks 中

    ^arrValues sorted:
         [:subArray | subArray at: 3] ascending ,
         [:subArray | subArray at: 2] ascending
    

    我们要感谢 Travis Griggs 介绍了那些很好的 SortFunction,它们提供了这些好看的函数样式

    他在他的 Objology 博客中发表了这篇文章 http://objology.blogspot.com/2012/05/tag-memoizedfunctions.html 并且可能在之前的帖子中

    【解决方案3】:

    这是一个不依赖于所用语言的经典排序问题。你有其他语言的经验吗?如果是这样,你会怎么写呢?

    考虑如下测试:

    [:a :b | (a at: 2) < (b at: 2) or: [
        (a at: 2) = (b at: 2) and: [(a at: 3) < (b at: 3)]]]
    

    或者,如果您知道一切都是字符串,您可以执行以下操作:

    [:a :b | ((at at: 2) , (a at: 3)) < ((b at: 2) , (b at: 3))]
    

    另外,请注意语言名称是Smalltalk(没有大写“T”)。

    【讨论】:

    • 我认为OP希望(a at: 3) , (a at: 2) &lt; ((b at: 3) , (b at: 2)),但这是一个细节
    • “这是一个经典的排序问题,不依赖于使用的语言。你有其他语言的经验吗?如果有,你会怎么写?” – 实际上,在许多其他语言中(例如 Ruby),集合是按字典顺序排列的,所以您只需要这样做(例如 Ruby an_array.sort_by {|_, second, third| [third, second] })。
    • 我尝试按照您的建议进行操作,但仍然没有显示正确的输出。
    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2019-09-01
    • 2016-02-01
    • 2015-06-28
    • 2016-04-11
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多