|
Итерация по соответствию на платформе 8.3.18.1363 идёт в обратном порядке | ☑ | ||
---|---|---|---|---|
0
sapphire
14.08.21
✎
00:49
|
При итерировании соответствия порядок в коллекции обратный, т.е. сначала идёт последний элемент коллекции
Ы=Новый Соответствие(); Для а=1 по 10 Цикл Ы.Вставить( а); КонецЦикла; Для Каждого КлючИЗначение Из Ы Цикл Сообщить(КлючИЗначение.Ключ); КонецЦикла; Если сделать тоже самое для структуры, то будет по мере добавления. |
|||
1
TormozIT
гуру
14.08.21
✎
07:35
|
В 8.3.19 тоже получаю такой порядок.
В 8.3.12 и ниже, 8.2, 8.1, 8.0 - это неверно. Порядок этот не гарантирован и может быть нестабильным даже в одной версии платформы. Если важен порядок обхода, то нужно использовать таблицу значений. Тогда будет всегда и везде работать как заложишь. |
|||
2
ДенисЧ
14.08.21
✎
07:41
|
Соответствие НИКОГДА не гарантирует порядка итерации.
Если тебе нужен именно порядок - используй более другие коллекции, например, список, массив или ТЗ. |
|||
3
vi0
14.08.21
✎
07:44
|
(0) если в документации порядок не описан то на него нельзя закладываться, даже если он есть
|
|||
4
Вафель
14.08.21
✎
09:24
|
Поменяли получается функцию хэша.
Ведь внутри соответствия все равно лежит массив |
|||
5
mistеr
14.08.21
✎
10:04
|
В Go эту проблему решили кардинально: итерация выдает элементы в случайном порядке. Это очень быстро отучило всех закладываться на порядок итерации.
Надо бы и 1С так сделать. Не в ущерб производительности, конечно. P.S. Странно, почему об этом говорю я, а не наш Go евангелист. :) |
|||
6
Волшебник
модератор
14.08.21
✎
10:06
|
(4) Это вряд ли...
(5) Оригинально |
|||
7
mistеr
14.08.21
✎
10:08
|
(4) Инфа 100%?
|
|||
8
Чинухов
14.08.21
✎
10:09
|
(5) Ну так и в 1С тоже в псевдослучайном порядке выдаёт :)
|
|||
9
ДенисЧ
14.08.21
✎
10:09
|
(5) Любая итерация? Расстрелять за это.
|
|||
10
Жан Пердежон
14.08.21
✎
10:35
|
(0) для структуры этот код работать не будет
|
|||
11
Жан Пердежон
14.08.21
✎
10:43
|
(7) Вафель херни не скажет, даже не смотря на то, что там лежит дерево)
|
|||
12
Yardman
14.08.21
✎
10:51
|
(4) Внутри соответствия лежит std::unordered_map
Конечно, можно сказать что бакеты это массив - ну тогда в платформе внутри всего лежат массивы. Ведь любой кусок памяти это массив... (5) Это какой-то дебильный способ решения. Нормальный, например - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/LinkedHashMap.html Порядок обхода соответствует порядку добавления. |
|||
13
Жан Пердежон
14.08.21
✎
10:54
|
(12) std::unordered_map в веб-клиенте? чем смотрел, что курил?
|
|||
14
Вафель
14.08.21
✎
11:25
|
(11) какое дерево. это же хэш мап. хэш функция дает индекс массива
|
|||
15
mistеr
14.08.21
✎
12:18
|
(14) Хеш мап несколько сложнее массива.
|
|||
16
mistеr
14.08.21
✎
12:23
|
(12) Фиксированный порядок обхода это дополнительные накладные расходы. И невозоможность заменить реализацию на более оптимальную в будущем.
Для случаев, когда порядок обхода важен, есть другие коллекции. |
|||
17
Злопчинский
14.08.21
✎
13:24
|
А для чего для соответствия ключ-значение должен быть фиксированный порядок обхода? зачем?
|
|||
18
acanta
14.08.21
✎
13:26
|
Не понимаю - если есть обход, то почему его порядок случайный?
|
|||
19
Злопчинский
14.08.21
✎
13:52
|
(18) э, это уже частности! давайте от общего к частностям.
обход - то бишь перебор - может быть и фиксированным и случайным. Почему для ключ-значение НУЖЕН фиксированный? практический смысл? |
|||
20
acanta
14.08.21
✎
13:57
|
Не понимаю. Если перебор случайный, зачем вообще ключ-значение в СУБД?
|
|||
21
acanta
14.08.21
✎
13:59
|
Или точнее зачем нужен перебор, если есть ключ-значение.
|
|||
22
acanta
14.08.21
✎
14:04
|
Грубо говоря - если в системе ЭТОТ объект использует метод ДЛЯ КАЖДОГО, то каждый следующий в ОДНОМ обходе должен соответствовать каждому следующему в ДРУГОМ обходе. Почему нет?
|
|||
23
Вафель
14.08.21
✎
14:23
|
В 1с не случайный, но не совпадает с порядком добавления.
|
|||
24
mistеr
14.08.21
✎
15:58
|
(22) А почему да?
А - абстракция. |
|||
25
mistеr
14.08.21
✎
15:59
|
Бывают коллекции вообще без обхода.
|
|||
26
acanta
14.08.21
✎
20:15
|
Сорян, погорячилась.
|
|||
27
oslokot
14.08.21
✎
21:05
|
Порядок в соответствиях зависит от фазы Луны, давно известный факт
|
|||
28
VS-1976
14.08.21
✎
21:26
|
(0) Скорее всего это происходит из-за того, что память выделяется постепенно. В каждом элементе коллекции есть ссылка на предыдущий элемент ( что бы уменьшить объём выделения памяти ) и так мы имеем:
Ы -> Ссылка на структуру последний элемент. Последний элемент Ключ, Значение Ссылка на предпоследний ... Куски занятой памяти Предпоследний элемент Ключ, Значение Ссылка на Предпоследний элемент - 1 ... По этому перебор идёт так от последнего, хотя соответствие по идее имеет по идее ещё и упорядоченный индекс, могли бы брать элементы и от туда... |
|||
29
VS-1976
14.08.21
✎
21:58
|
(28) По идее должно быть так:
Структура это 2 массива 1-й массив это упорядоченный ключ 2-й массив ( условно ) это хранящиеся значения. Что бы в случае замещения значения с имеющимся ключём освободить память значения, выделить новый кусок памяти под новое значение ( плавающее по размеру ). Элемент ключа Ссылка на предыдущий элемент Ссылка на Значение Почему так: Да по тому что вставляя элемент ищется куда его вставить для упорядочивания ключа 1. Выделяется свободный кусок памяти. Далее ищется куда в цепочке засунуть новый элемент Прописываются ссылка в зависимости от вставки Ссылка разрываемого элемента корректируется В те элемент, который разрывается корректируем ссылку: Элемент 1 Элемент 3 Вставляем элемент 2 к примеру: Так как Элемент 3 ссылается на Элемент 1 и нужно это подправить ( данные в памяти разумеется никто не передвигает ): Элемент 1 <------+ | Элемент 3------+ | | | +-- Элемент 2<-+ | +----------------+ PS: Обычно "узлы" знают предшественника и последующий элемент, что бы по структуре можно было гулять в разные стороны... |
|||
30
VS-1976
14.08.21
✎
22:07
|
(27) Скорее всего из ходя из домыслов в (29). Соответствие тупо выбирается из упорядоченного массива
|
|||
31
Злопчинский
14.08.21
✎
22:25
|
(21) вот именно, это и интересно.
|
|||
32
Хосе
14.08.21
✎
22:32
|
(0) а никто и не обещал
|
|||
33
Хосе
14.08.21
✎
22:33
|
Вот например: https://infostart.ru/public/117041/
|
|||
34
acanta
15.08.21
✎
08:26
|
Вероятно, обсуждается работа с ключ-значение внутри запросов и всякие соединения с данными и временными таблицами?
|
|||
35
ДедМорроз
15.08.21
✎
08:38
|
ХэшФункция никогда не дает однозначности
Будет массив хэшей и массив массивов значений хэшей. Что касается самих значений,то размер переменной в любом языке фиксирован,что не влезло (строки,объекты и т.п.) хранятся в отдельной памяти. Опять же,реализация через одно или двухсвязные списки - это самое простое,но в реальности,проще работать с блоками памяти,причем или фиксированного размера или нескольких фиксированных размеров,тогда фрагментация памяти меньше влияет на производительность. Сделать перебор в случайном порядке - сложно,а вот начать перебор с текущего элемента можно. И порядок элементов позволяет в процессе перебора добавлять элементы в коллекцию,зная,что они будут в конце. Если этого нет,то добавление элемента в процессе перебора будет приводить к странным последствиям. |
|||
36
Хосе
15.08.21
✎
09:47
|
(35) но ведь 1с не обещала порядок перебора? Значит на это рассчитывать нельзя
|
|||
37
ДенисЧ
15.08.21
✎
09:51
|
(35) Изменение перебираемой коллекции в общем случае - UB. А за такое по рукам линейкой шлёпают.
|
|||
38
tgu82
15.08.21
✎
10:46
|
Помнится в ТП 5.5 успешно пользовался кучей и указателями. Можно было такие фишки выделывать, такую настраиваемость универсальность создавать при решении задач а главное всем управляешь сам - вплоть до оверлеев и до ассемблерных вставок. Это была Жизнь :)
|
|||
39
tgu82
15.08.21
✎
10:48
|
(38)+ Хотя в 1с все это же присутствует в т.ч. в виде внешних компонент.
|
|||
40
ДенисЧ
15.08.21
✎
11:31
|
(38) В ТП5 оверлеии и ассемблер были искаропки.
|
|||
41
Злопчинский
15.08.21
✎
11:33
|
(38) а в Фортране можно было оверлеи делать на области данных...
|
|||
42
Злопчинский
15.08.21
✎
11:34
|
(38) Жизнь была на Ассемблере только, остальное все - извращения нетолерантные... ;-)
|
|||
43
welwel
15.08.21
✎
11:45
|
(1) а для массивов при переборе элементов в цикле Для каждого порядок тоже может отличаться от цикла Для i=0 и получения элементов через А[i]?
|
|||
44
ДенисЧ
15.08.21
✎
11:52
|
(43) Массив гарантирует последовательность.
|
|||
45
ДедМорроз
16.08.21
✎
21:42
|
(37) А в чем проблема?
Вполне реальные задачи - перебрать коллекцию и добавить что-то в нее же. При нормальной реализации,проблем быть не должно,даже при удалении перебираемого элемента. Но,все используют кривую реализацию и потом говорят,что так нельзя. |
|||
46
NorthWind
16.08.21
✎
21:50
|
(0) А где-то обещали порядок? "Для каждого" озачает, что каждый элемент будет извлечен внутрь операторных скобок цикла, но что это будет в определенном порядке - где это обещали? Покажите мне это место в доке.
|
|||
47
acanta
16.08.21
✎
21:52
|
А повторно уже ранее полученный элемент может быть?
|
|||
48
NorthWind
16.08.21
✎
21:55
|
(47) нет. Каждый элемент один раз. Но порядок может быть произвольным, т.е. может быть подряд, может быть обратный, может быть и случайный.
|
|||
49
BeerHelpsMeWin
16.08.21
✎
22:18
|
(0) А что не так?
Хотите упорядочивание - используйте конструкции, где есть упорядочивание. |
|||
50
BeerHelpsMeWin
16.08.21
✎
22:19
|
а так это как в "выбрать первые 1 из ...." без упорядочивания, вот всегда возвращалась правильная ссылка, а теперь неправильная!!!! ПЛОХАЯ 1С НЕГОДНАЯ
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |