2014-07-15 3 views
4

사전 "a Dictionary(#DOB->Date #Name->String #Salary->Number)"이 있습니다. str:= "DOB Date,Name String,Salary Number"이어야하는 문자열을 만들어야합니다. keysAndValuesDo을 사용해 보았지만 제대로 연결하지 못했습니다.문자열 사전

dict associations 
    do: [ :assoc | 
    aStream 
     nextPutAll: assoc key asString; 
     space; 
     nextPutAll: assoc value asString ] 
    separatedBy: [ aStream nextPut: $, ] 

가있는 점에 유의하시기 바랍니다 :이 길을 갈 수 있고, 스트림 : 당신이 #do 사용하려는 경우

(dict associations collect: [ :assoc | 
    assoc key asString, ' ', assoc value asString ]) 
    joinUsing: $, 

을 :

답변

4

이 같은 좋은 방법으로 그것을 할 수 있습니다 인쇄를 객체 자체에 위임하고 문자열로 변환하지 않고 스트림에 직접 입력하려면 다음을 사용할 수 있습니다.

aStream 
    print: assoc key; 
    .... 

#print: 스트림의 메서드는 #printOn:을 매개 변수로 보냅니다. #printOn:은 스트림에서 개체를 제대로 인쇄 할 수 있도록 재정의해야하는 defat 메서드입니다. #asString은 많은 개체에 #printOn:을 사용합니다.

+0

감사합니다. – Biparite

+0

@Harshit 당신도 환영합니다. #do : strategy를 사용하는 스 니펫을 추가했습니다. – Uko

+0

#nextPutAll : #print :가 아닌 #print 사용 : '#Name' 'PString', # DOB ''Date '', # Salary ''Number '' '' – MartinW

1

keysAndValuesDo도 사용할 수 있습니다. 사전이 주문되지 않았으며 멋진 keysAndValuesDo가 없다는 것을 기억하십시오. separBy :

|dict first str| 
dict := OrderedIdentityDictionary 
    newFromPairs:#(#DOB Date #Name String #Salary Number). 
first := true. 
str := String streamContents: [ :s | 
    dict keysAndValuesDo: [ :key :value | 
     first ifFalse: [ s nextPutAll: ',' ] 
      ifTrue: [ first := false]. 
     s nextPutAll: key; space; 
      nextPutAll: ''; 
      nextPutAll: value] ]. 
str 

'DOB Date,Name String,Salary Number' 
+0

이고 어떻게 'Date', 'Name', 'salary'를 얻을 수 있습니까? – Biparite

+0

왜 키와 값을 혼합하고 싶습니까? 그리고 대문자와 소문자 혼합? 따옴표를 추가하려면 nextPutAll을 사용하십시오. '' '' –