2016-08-20 4 views
1

Обновление Устранена ошибка компиляции, теперь единственной проблемой с кодом является сортировка dict в алфавитном порядке для печати.Как отсортировать dict в genie

Я рефакторинг argument parser из python в Genie, однако я обнаружил, что застрял в том, как сортировать элементы формы dict перед добавлением их в список.

В питоне это так просто, как:

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 = {}

Теперь, как можно распечатать содержимое Dict, но отсортирован?

Вот код, где я застрял:

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 строки, строки

Там нет компиляции ошибки в этом разделе кода больше. Мой вопрос заключается в том, как отсортировать элементы dict перед добавлением их в список lines?

+0

Когда вы говорите «парсер аргументов», вы имеете в виду аргументы, переданные из командной строки в программу? – AlThomas

+0

Я имею в виду, как в [здесь] (https://github.com/dmulholland/clio) ... Но я думаю, что я пытаюсь достичь, не имеет ничего общего с этой проблемой, с которой я столкнулся ... Проблемы в том, как для итерации по типу, который был отсортирован в алфавитном порядке ... –

+1

Если вы ищете аргументы командной строки, вы должны смотреть на OptionContext и OptionEntry GLib. Это полезно для большинства целей. Например, в 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

A dict of есть на самом деле Gee.HashMap of K, V, поэтому вы можете посмотреть, какой тип keys.

keys имеет тип Gee.Set of G который не имеет способ сортировки.

Это, однако извлечь из Gee.Collection of G, которые мы можем использовать, чтобы сделать новый временный list of string (который Gee.ArrayList под капотом и имеет метод sort).

Я положил это на функцию sort_string_collection (которая может даже быть общей, поскольку она не относится к строкам, но я не беспокоился, потому что it's not easily possible with Genie at the moment).

С добавлением тестового кода, чтобы сделать его 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; 

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) 

Или еще более минималистичный (если мы когда-нибудь использовать StackOverflow Документацию Genie, это будет хорошим примером):

[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's TreeMap лучше. TreeMap реализует Gee.SortedMap, чтобы вы получили как свойства ascending_keys, так и 'ascending_entries'. – AlThomas

+0

Это правда, всегда разумно выбирать наиболее подходящую структуру данных. Вы должны думать о преобразовании своего комментария в ответ, поскольку это альтернатива моей. –

+0

Спасибо вам, два! Какова функция @ в печати (@ ...) и lines_add (@ ...)? –

Смежные вопросы