【问题标题】:SortedCollection that ignores case in stringsSortedCollection 忽略字符串中的大小写
【发布时间】:2019-05-07 09:36:04
【问题描述】:

默认情况下,SortedCollection 是区分大小写的(考虑到当今大多数使用字符串的方式,这让我感到惊讶),例如,

list := #('z' 'c' 'C' 'A' 'a').
slist := list asSortedCollection. "a SortedCollection('A' 'C' 'a' 'c' 'z')"

通过 Spotter,我找到了 caseInsensitiveLessOrEqual:,但不知道如何将它与 SortedCollection 一起使用。如何轻松获得忽略大小写的排序集合?

【问题讨论】:

    标签: smalltalk pharo


    【解决方案1】:

    asSortedCollection: 也有一个排序块:

    list := #('z' 'c' 'C' 'A' 'a').
    slist := list asSortedCollection: 
        [ :a :b | a caseInsensitiveLessOrEqual: b ]. "a SortedCollection('a' 'A' 'C' 'c' 'z')"
    

    编辑这是一个获得一致订单的解决方案(这很难看,我是通过潜入caseInsensitiveLessOrEqual:得到的)

    caseInsensitiveCompare := [ :a :b | | result | 
        result := a compare: b caseSensitive: false.
        "equal ignoring case" 
        result = 2 ifTrue: [ a compare: b caseSensitive: true ].
        "less than, so return true (else return false since result=2)" 
        result = 1  ].
    
    slist := list asSortedCollection: caseInsensitiveCompare. 
    "a SortedCollection('A' 'a' 'C' 'c' 'z')"
    

    【讨论】:

    • 你也可以接受你的答案。最好让其他人知道您找到了解决方案。
    • @tukan 我必须等待一段时间才能选择正确的解决方案。也许你有更好的?
    • 当我认真考虑它时,我完全按照你的思路思考 - #asSortedCollection: 接受了一个你定义条件的块。您的解决方案是我认为最自然的解决方案。 (你总是可以做多种方式,但我更喜欢干净简单的解决方案)
    • 您的解决方案确实存在大写是否在小写之前不一致的问题:'a','A',但是'C','c'。
    • 我建议您按照@tukan 的建议接受您自己的解决方案。
    【解决方案2】:

    我将答案添加到地址@Amos M. Carpenter 评论 - 排序稳定性。您的第二个代码不必要地复杂。您可以做的是在list 中添加一个asSortedCollection(这将根据字母位置和“大写”对字符串进行排序,您将获得一致的解决方案:

    list := #('z' 'c' 'C' 'A' 'a') asSortedCollection.
    slist := list asSortedCollection: 
        [ :a :b | a caseInsensitiveLessOrEqual: b ]. "SortedCollection('a' 'A' 'c' 'C' 'z')"
    
    list := #('z' 'C' 'c' 'A' 'a') asSortedCollection.
    slist := list asSortedCollection: 
        [ :a :b | a caseInsensitiveLessOrEqual: b ]."SortedCollection('a' 'A' 'c' 'C' 'z')"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2016-01-29
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2011-02-06
      • 2019-12-03
      • 2013-04-11
      相关资源
      最近更新 更多