Как сортировать диктовку в джинне

vala genie

98 просмотра

2 ответа

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

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

В Python это так просто, как:

    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?

Автор: lf_araujo Источник Размещён: 08.11.2019 11:06

Ответы (2)


2 плюса

А 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функцию (которая может быть даже Generic, поскольку она не специфична для строк, но я не стал беспокоиться, потому что в настоящее время это не так просто с Genie ).

С добавленным тестовым кодом, чтобы сделать его 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])")
Автор: Jens Mühlenhoff Размещён: 04.09.2016 11:02

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])")
Автор: lf_araujo Размещён: 09.09.2016 10:37
32x32