Это потому, что словари в Юлии (Dict
) не упорядочены: каждый словарь поддерживает набор ключей. Порядок получения ключей при итерации по этому набору не определен и может варьироваться при добавлении новых записей. Есть две вещи, которые можно сделать, чтобы убедиться, что каждый выполняет итерацию по словарным записям в указанном c порядке.
Первый способ - получить набор ключей (используя keys
) и отсортировать их самостоятельно, как было предложено в другом ответе:
julia> fruits = Dict("Mangoes" => 5, "Pomegranates" => 4, "Apples" => 8);
julia> for key in sort!(collect(keys(fruits)))
val = fruits[key]
println("$key => $val")
end
Apples => 8
Mangoes => 5
Pomegranates => 4
При этом, если порядок ключей важен, можно отразить этот факт в системе типов, используя упорядоченный словарь ( OrderedDict ), которая представляет собой структуру данных, в которой порядок записей имеет смысл. Точнее, OrderedDict
сохраняет порядок, в котором его записи были вставлены.
Можно либо создать OrderedDict
с нуля, позаботившись о вставке ключей по порядку, и порядок будет сохранен. Или можно создать OrderedDict
из существующего Dict
, просто используя sort
, который будет сортировать записи в порядке возрастания их ключа:
julia> using OrderedCollections
julia> fruits = Dict("Mangoes" => 5, "Pomegranates" => 4, "Apples" => 8);
julia> ordered_fruits = sort(fruits)
OrderedDict{String,Int64} with 3 entries:
"Apples" => 8
"Mangoes" => 5
"Pomegranates" => 4
julia> keys(ordered_fruits)
Base.KeySet for a OrderedDict{String,Int64} with 3 entries. Keys:
"Apples"
"Mangoes"
"Pomegranates"