2016-08-20 16 views
1

업데이트 이제 컴파일 오류를 해결했습니다. 코드의 유일한 문제점은 예쁜 인쇄를 위해 사전 순으로 알파벳순으로 정렬하는 방법입니다.지니에서 사전을 정렬하는 방법

을 파이썬에서 Genie로 리팩토링하고 있지만 목록에 추가하기 전에 항목을 정렬하는 방법에 집착했습니다.

lines.append("Options:") 
    if len(self.options): 
     for name, option in sorted(self.options.items()): 
      lines.append(" %s: %s" % (name, option.values)) 
    else: 
     lines.append(" [none]") 

self.options가 딕셔너리의 내용을 인쇄 할 수있는 방법 self.options = {} 이제

로 선언하지만, 정렬 : 파이썬에서

은 같이 간단하다? 여기

내가 붙어 코드입니다 :

def ListOptions() 
    var lines = new list of string 

    lines.add("Options:") 
    if _options.size != 0 
     for name in _options.keys 
      lines.add(" %s: %s" % (name, _options.values)) 
    else 
     lines.add(" [none]") 

ListOptions 클래스 내에서 방법이다, 나는 _options로 _options 선언 :

더 컴파일 오류가없는 문자열의 새로운 DICT, 문자열을 더 이상 코드의 해당 섹션에서. 내 질문은 목록에 추가하기 전에 사전의 요소를 정렬하는 방법입니다 lines?

+0

"인수 파서"라고 할 때 인수는 명령 줄에서 프로그램으로 전달되는 것을 의미합니까? – AlThomas

+0

내 말은 [여기] (https://github.com/dmulholland/clio) ...하지만 내가 뭘 하려는지는 내가 직면하고있는이 문제와 관련이 없다고 생각한다. 문제는 어떻게 알파벳순으로 정렬 된 dict를 반복합니다 ... –

+1

명령 줄 인수를 구문 분석하려면 GLib의 OptionContext 및 OptionEntry를 살펴야합니다. 이것은 대부분의 목적에 유용합니다. Vala의 예제는 http://stackoverflow.com/questions/33431446/how-to-do-optioncontext-parsing-on-an-instance – AlThomas

답변

2

토마스와 제인의 의견을 바탕으로 TreeMap을 사용할 수도 있습니다. 다음과 같습니다 :

[indent=4] 

uses 
    Gee 

init 
    var dic = new TreeMap of string, string 
    dic["z"] = "23" 
    dic["abc"] = "42" 
    dic["pi"] = "3.141" 
    for k in dic.ascending_keys 
     print (@"$k: $(dic[k])") 
2

dict of은 실제로 Gee.HashMap of K, V이므로 어떤 종류의 keys 속성을 조회 할 수 있습니다.

keys은 정렬 방법이없는 Gee.Set of G입니다.

그것은 그러나 우리가 만드는 데 사용할 수있는 Gee.Collection of G에서 파생 않는 새 (후드 Gee.ArrayList이며 sort 방법을 가지고) 일시 list of string.

저는 이것을 sort_string_collection 함수에 넣었습니다. (문자열에 특정한 것이 아니기 때문에 Generic 일 수도 있지만 it's not easily possible with Genie at the moment 때문에 신경 쓰지 않았습니다). 우리가 이제까지 지니에 대한 유래 문서를 사용할 수있는 경우,이 좋은 예가 될 것이다 (

[indent=4] 

def sorted_string_collection (collection: Gee.Collection of string): Gee.Iterable of string 
    var l = new list of string 
    l.add_all (collection); 
    l.sort() 
    return l; 

def list_options (_options: dict of string, string): list of string 
    var lines = new list of string 

    lines.add("Options:") 
    if _options.size != 0 
     for name in sorted_string_collection (_options.keys) 
      lines.add(@" $name: $(_options[name])") 
    else 
     lines.add(" [none]") 

    return lines 

init 
    var opts = new dict of string, string 
    opts["z"] = "23" 
    opts["abc"] = "42" 
    opts["pi"] = "3.141" 
    var l = list_options (opts) 
    for var s in l 
     print (s) 

또는 더 최소한의를 : 추가 테스트 코드와

, 그것을 MCVE를 만들 수는, 결과는 다음과 같습니다) :

[indent=4] 

def sorted_string_collection (collection: Gee.Collection of string): Gee.Iterable of string 
    var l = new list of string 
    l.add_all (collection); 
    l.sort() 
    return l; 

init 
    var dic = new dict of string, string 
    dic["z"] = "23" 
    dic["abc"] = "42" 
    dic["pi"] = "3.141" 
    for k in sorted_string_collection (dic.keys) 
     print (@"$k: $(dic[k])") 
+1

을 참조하십시오. 키에서 값까지 효율적으로 검색하고 키와 값을 정렬하려면 Gee의 TreeMap이 더 좋습니다. TreeMap은 Gee를 구현합니다.SortedMap을 사용하면'ascending_keys'와'ascending_entries' 속성을 모두 얻을 수 있습니다. – AlThomas

+0

사실, 가장 적합한 데이터 구조를 선택하는 것이 좋습니다. 내 의견에 대한 답을 광산에 대한 대안으로 생각해야합니다. –

+0

두 분 덕분에! print (@ ...) 및 lines_add (@ ...)에서 @의 기능은 무엇입니까? –