Страницы: 1
RSS
Как узнать ключ словаря по значению без цикла?
 
Доброе утро.
Код
Sub dddd()
Dim dic As New dictionary
Set dic = New dictionary
dic(123) = "Сто двадцать три"
dic(234) = "Двести тридцать четыре"
dic(345) = "Тристо сорок пять"
MsgBox dic.Keys(2) 'узнать ключ по порядковому номеру
MsgBox dic.Items(2) 'узнать значение по порядковому номеру
MsgBox dic(345) 'узнать значение по ключу
End Sub

Можно ли без цикла узнать:
1) Ключ по значению?
2) Порядковый номер по ключу?
3) Порядковый номер по значению?

с 1-м и с 3-м вопросами я чё-то ступил.
Изменено: Бахтиёр - 07.09.2020 08:22:51
 
Бахтиёр, но ведь одно и то же значение может соответствовать разным ключам и соответственно разным порядковым номерам
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, верно, с 1-м и с 3-м вопросами я чё-то ступил.

А 2-й?
 
Цитата
Бахтиёр написал:
Порядковый номер по ключу?
нет. Реализация словаря вообще не предполагает какой-то вменяемой индексации. Иначе говоря, получив индекс для ключа один раз, во второй раз для этого же ключа индекс может быть другим.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, понятно, спасибо.
 
Бахтиёр, здравствуйте
Не dic.Keys(3), как в массивах, а dic.Keys()(3)
Читайте матчасть — это лучшее, что есть по словарям
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Но в этом лучшем не написано то, про что выше говорил Дмитрий.
И более того исходя из этого там есть потенциальные ошибки, например в описании выгрузки из словаря.
 
Hugo, я не отменял слов Димы))
Никто не мешает мгновенно получить из словаря одномерный массив всех ключей или элементов и работать с этим массивом в привычном режиме (с индексами и т.д.)
Изменено: Jack Famous - 07.09.2020 10:20:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Я говорю про другое - нет связи между ключом и итемом по индексу словаря. Помню где-то в доках это видел, но не могу сейчас найти. Нигде в оф.описаниях этот момент вообще никак не освещается :(
 
Коллеги приведите пример, когда это нужно?
Цитата
Jack Famous написал:
Никто не мешает мгновенно получить из словаря одномерный массив всех ключей или элементов и работать с этим массивом в привычном режиме (с индексами и т.д.)
Алексей, мгновенно не получится, там столько операций, удивитесь (обход словаря, выделение памяти, копирование в массив и т.д.)  Плюс работа с массивом в некоторых операциях медленнее словаря. Ибо тогда зачем бы он понадобился? Это совсем разные сущности.
«Бритва Оккама» или «Принцип Калашникова»?
 
Hugo, Индекс не гарантирует положение - Дима уже сказал, я с этим не спорил
bedvit, когда нужно? Для сортировки ключей или элементов словаря, например
Не мгновенно? Получить 100 тыс ключей из словаря - 0 мс, до меня это мгновенно, а большее количество ключей начинает сильно грузить словарь

UPD: 0 мс - для целочисленных ключей от 1 до 100 тыс и 23 мс, если к этому числу прицепить строку 150 символов
Изменено: Jack Famous - 07.09.2020 12:18:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous:  Не dic.Keys(3), как в массивах, а dic.Keys()(3)
При подключенной библиотеке Microsoft Scripting Runtime:
Такой код:
Код
Sub dddd()
Dim dic As New dictionary
Set dic = New dictionary
dic(123) = "Сто двадцать три"
MsgBox dic.keys(0)
End Sub
НЕ ВЫДАЁТ ошибку.

А такой код:
Код
Sub dddd()
Set dic = CreateObject("Scripting.Dictionary")
dic(123) = "Сто двадцать три"
MsgBox dic.keys(0)
End Sub
выдаёт ошибку
 
Это стресс-тест для компилятора. :)  Пишите так:
Код
Sub dddd()
Dim dic, keys
Set dic = CreateObject("Scripting.Dictionary")
dic(123) = "Сто двадцать три"
keys = dic.keys
MsgBox keys(0)
'MsgBox dic.keys(0)
End Sub
Владимир
 
Бахтиёр, для первого варианта:
1. Удалите строку 3 или строку 2 пишите без New
2. Как обратиться по индексу я уже писал, а вам чихать — MsgBox dic.Keys()(0)

Мы все тут уже давно не по теме беседуем, так что либо заканчивайте, либо предлагайте новое название для темы
Ответ на существующий вопрос: никак
Изменено: Jack Famous - 07.09.2020 13:09:29
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Бахтиёр написал:
2) Порядковый номер по ключу?
У словаря нет такого метода.
"Все гениальное просто, а все простое гениально!!!"
 
Спасибо всем.
Страницы: 1
Наверх