SortedCollection, которая игнорирует регистр в строках - PullRequest
5 голосов
/ 07 мая 2019

По умолчанию SortedCollection чувствителен к регистру (что мне кажется удивительным, учитывая то, как строки в основном используются сегодня), например,

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

С Spotter я обнаружил caseInsensitiveLessOrEqual:, но не был 'не знаю, как использовать его с SortedCollection.Как я могу легко получить отсортированную коллекцию, которая игнорирует регистр?

Ответы [ 2 ]

4 голосов
/ 07 мая 2019

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')"
1 голос
/ 08 мая 2019

Я добавляю ответ на адрес @ Амос М. Карпентер комментарий - стабильность сортировки.Ваш второй код излишне сложен.Что вы можете сделать, это добавить один asSortedCollection к list (который будет сортировать позиции алфавита на основе строк и «заглавность», и вы получите согласованное решение:

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')"
...