2012-03-16 2 views
4

나는이 같은 사전을 가지고 :스몰 토크에서 값으로 사전을 정렬하는 방법은 무엇입니까?

a PluggableDictionary(
    Rankable1->8.5 
    Rankable2->9.0 
) 

내가 내림차순 순서로 Rankable 객체와 단지 OrderedCollection 필요합니다

a OrderedCollection(
    Rankable2 
    Rankable1 
) 

나는 키가 정렬 쉽게 발견하지만 값으로 정렬하기가 다소 어려웠습니다. 이렇게하는 작은 방법은 무엇입니까?

+0

내가 물어 것

(Dictionary newFrom: { 2 -> 'b' . 1-> 'a' }) asSortedCollection "--> a SortedCollection('a' 'b')" 

(가족 이죠 및 Pharo에서 테스트) 사전? 당신은 아마 그것에 대한 잘못된 데이터 구조를 사용합니다. –

답변

5

당신이 중요하지 않은 루프에서 한 샷 분류 수집이 필요한 경우는 다음과 같이 (예를 들어 사전을 초기화 pharo 구문을 사용) 사용할 수 있습니다 : 당신이하고자하는 경우

pd := PluggableDictionary newFromPairs: { 'a' . 2 . 'b' . 1 . 'c' . 3} . 

(pd associations asSortedCollection: [:x :y | x value < y value]) 
      collect: [:assoc | assoc key]. 

을 이 컬렉션을 계산할 수있는 자신 만의 클래스를 도입하는 것이 좋습니다. 당신이 VisualWorks를 사용하는 경우

+0

오, 나는 메소드'asSortedCollection :'을 알지 못했다. 분명히 더 읽기 쉽습니다. 감사! 추신 : 그것은'<' –

1

는 알았어요 :

^ ((SortedCollection sortBlock: 
    [:association :otherAssociation | association value > otherAssociation value]) 
    addAll: theDictionary associations; 
    yourself) collect: [:association | association key] 
+0

나는 더 좋게/더/더 작은 스몰 토크 방법을 받아 들일 것이다. :) –

2

, 당신은 당신이 그리스를 사용할 수있는 경우

(aDictionary associations sort: #value ascending) collect: #key 
2

에이 모든을 줄이기 위해 SortFunction 및 기호 >> 값 동작을 이용할 수 있습니다 (예를 들어, 해변을 사용하는 경우) 은 아마도 을 사용할 수 있습니다. 그것은 작은 사전을위한 키 당 아마 여러 값을위한 것입니다.

두 번째 주에

, 아마 당신은 키와 값을 교체 할 수 있습니다, 그냥 같이, #asSortedCollection을 보내 : 당신이 정렬이 필요한 이유

+0

대신'>'아니면 그냥 : (사전 newFrom : {2 -> 'b'.1 -> 'a'}) 정렬되어야합니다. –

관련 문제