LINUX.ORG.RU

Итерация по HashMap в Rust какая-то странная

 ,


1

2

Элементарный код.

use std::collections::HashMap;

fn main() {
    let mut test = HashMap::new();

    test.insert(1, "first line");
    test.insert(2, "second line");
    test.insert(3, "third line");
    test.insert(4, "fourth line");


    for (key, value) in &test {
        println!("{}: {}", key, value);
    }
}

Почему-то на выходе:

2: second line
1: first line
4: fourth line
3: third line
Не верный порядок. Или это не гарантировано?

★★★★★

Или это не гарантировано?

Нет. Это нигде не гарантированно, как правило.

crutch_master ★★★★★
()

https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.iter

An iterator visiting all key-value pairs in arbitrary order.

Полезно читать документацию. Там вот ещё есть кое-что:

Use a BTreeMap when:

  • You want a map sorted by its keys.
  • You want to be able to get a range of entries on-demand.
  • You’re interested in what the smallest or largest key-value pair is.
  • You want to find the largest or smallest key that is smaller or larger than something.
quantum-troll ★★★★★
()

Если тебе нужна сортировка по ключам, то нужно использовать BTreeMap.

O02eg ★★★★★
()
Ответ на: комментарий от quantum-troll

Полезно читать документацию

Да полезно хотя бы быть знакомым с базовыми структурами данных

anonymous
()
Ответ на: комментарий от Virtuos86

В js всё по порядку, если после сознания объект не трогать (правда не стоит это использовать где-то). А Map так вообще гарантирует порядок.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

HashMap и Map это разные структуры данных.

Всё правильно сказали выше, используй BTreeMap

fsb4000 ★★★★★
()
Ответ на: комментарий от Virtuos86

Прям во всех? А то «лиспы» это всё очень разные ЯП во многом.

А ты хотел полный и развернутый список с описанием реализаций? Во многих.

Serral
()
Ответ на: комментарий от Serral

Во многих.

Еще пара наводящих вопросов, и от «в лиспах» останется 2-3 реализации борщелишпа с развитыми компиляторами.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Еще пара наводящих вопросов, и от «в лиспах» останется 2-3 реализации борщелишпа с развитыми компиляторами.

Не останется, ассоциативные списки это то, что ес-но в лиспах и встречается повсеместно. В том числе потому, что в наколенных реализациях их очень легко реализовать.

Serral
()

Есть у меня знакомый дурачок, который на питоне года 4 или 5 писал, пока до него дошло, что dict не сохраняет порядок. А потом уже и порядок через пару месяцев завезли. Короче, лол, базовая и очевидная вещь ведь.

WitcherGeralt ★★
()
Ответ на: комментарий от Virtuos86

Какие «ассоциативные списки»? Что за новомодная терминология?

Это старомодная терминология. Но приравнивать ассоциативный список и хэш — это сильно. При том, что хэш в лиспах тоже есть:

(defvar a (make-hash-table))
(setf (gethash 1 a) "first line")
(setf (gethash 2 a) "second line")
(setf (gethash 3 a) "third line")
(setf (gethash 4 a) "fourth line")
(maphash #'(lambda (key val) (format t "~a: ~a~%" key val)) a)

выводит на SBCL 1.4.16

1: first line
2: second line
3: third line
4: fourth line
monk ★★★★★
()
Ответ на: комментарий от Virtuos86

Какие «ассоциативные списки»? Что за новомодная терминология?

Не к тебе. давайте уже поговорим за perl и php.

hbars ★★★★★
()
Ответ на: комментарий от monk

Но приравнивать ассоциативный список и хэш — это сильно. При том, что хэш в лиспах тоже есть:

Я отвечал на пост, где было написано про ассоциативные массивы. А вот хэш-таблички в писпах встречаются уже пореже.

выводит на SBCL 1.4.16

Зависит от хэша, тут в принципе нет смысла смотреть на порядок пар.

Serral
()
Ответ на: комментарий от WitcherGeralt

Есть у меня знакомый дурачок, который на питоне года 4 или 5 писал, пока до него дошло, что dict не сохраняет порядок.

В питоне для этого был OrderedDict, он должен был про него знать, если писал на питоне 4-5 лет.

sniper21 ★★★★★
() автор топика
Последнее исправление: sniper21 (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

Ждём тему о том, почему в Rust 0.1 + 0.2 != 0.3

Нет, не дождешься :)

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Ты удивишься, но так и было. Только он был школо-студентом, а не разрабом фулл-тайм, как ты, наверное, подумал.

был OrderedDict

Он никуда не делся.

WitcherGeralt ★★
()

Дык всё так и должно быть. В крайнем случае LinkedHashMap мог бы сохранять порядок (не знаю, есть ли реализация в стандартной библиотеке, но можно и самому реализовать, несложно).

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Вы бы еще питоновский OrderedDict упомянули. Перефразирую свой вопрос, чтобы больше меня не дергали: «Разве запоминание порядка добавления итемов в ассоциативный массив является одной из ключевых особенностей данного типа коллекций данных?»

Virtuos86 ★★★★★
()
Ответ на: комментарий от crutch_master

нет, там в ES2020 упоролись и порядок ввели все-таки, ужас конечно.


 var o = {}, x = 10n**15n; while (x != 1) o[x = x/10n] = 1; Object.keys(o);
[ '1',
  '10',
  '100',
  '1000',
  '10000',
  '100000',
  '1000000',
  '10000000',
  '100000000',
  '1000000000',
  '100000000000000',
  '10000000000000',
  '1000000000000',
  '100000000000',
  '10000000000' ]
drsm ★★
()
Ответ на: комментарий от Virtuos86

ассоциативный массив

Нет, более того, реализация в виде именно хеш-таблицы - тоже необязательное требование в общем случае (можно и деревом, а можно вообще хоть списком).

BattleCoder ★★★★★
()
Ответ на: комментарий от Virtuos86

Ну в Яве есть LinkedHashMap, в котором гарантирован порядок в котором в него запихивали.
Видать ТСу надо что-то подобное.

WatchCat ★★★★★
()
Ответ на: комментарий от Virtuos86

А где вы видели ассоциативные массивы, которые это гарантируют?

Ты опять умничаешь, ламерюга? Такие коллекции есть везде, даже в твоей ржавой скриптухе.

anonymous
()
Ответ на: комментарий от sniper21

5 звезд, ипать-копать. Учиться надо было в школе, дедуля.

anonymous
()
Ответ на: комментарий от im-0

Не нужно быть царем, чтобы помножить очередную бездарность на ноль.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.