Как реализовать многоиндексный словарь?

Вот как я это делаю (это может быть не оптимально, но оно работает):

Создайте div, который вы хотите быть полупрозрачным. Дайте ему класс / id. Оставьте его ПУСТОЙ и закройте его. Дайте ему заданную высоту и ширину (скажем, 300 пикселей на 300 пикселей). Дайте ему непрозрачность 0,5 или все, что вам нравится, и цвет фона.

Затем, НЕПОСРЕДСТВЕННО НИЖЕ, что div, создайте еще один div с другим классом / id. Создайте абзац внутри него, где вы разместите свой текст. Дайте div позицию: относительный и верхний: -295px (это НЕГАТИВНО 295 пикселей). Дайте ему z-индекс 2 для хорошей меры и убедитесь, что его непрозрачность равна 1. Создайте свой абзац, как вам нравится, но убедитесь, что размеры меньше, чем размеры первого div, поэтому он не переполняется.

Вот и все. Вот код:

.trans {
  opacity: 0.5;
  height: 300px;
  width: 300px;
  background-color: orange;
}
.trans2 {
  opacity: 1;
  position: relative;
  top: -295px;
}
.trans2 p {
  width: 295px;
  color: black;
  font-weight: bold;
}
<body>
  <div class="trans">
  </div>
  <div class="trans2">
    <p>
      text text text
    </p>
  </div>
</body>

Это работает в Safari 2.x, я не знаю об Internet & nbsp; Explorer.

29
задан Ian Nelson 5 March 2010 в 13:29
поделиться

10 ответов

Я бы реализовал структуру данных с этими двумя словарями

Dictionary<TKey1, KeyValuePair<TKey2, TValue>> dict1;
Dictionary<TKey2, KeyValuePair<TKey1, TValue>> dict2;

Таким образом, если вам дается 1 ключ, у вас есть как значение, так и другой ключ для удобного удаления и обновления.

21
ответ дан 28 November 2019 в 00:08
поделиться

Значит, вам нужен многоиндексный словарь, поддерживающий поиск на основе любого ключа и поддерживающий расширения для нескольких ключей?

Может быть, вы думаете о неправильной структуре данных, попробуйте KD-Tree ] вместо этого. Неизменяемое KD-дерево удовлетворяет требованиям безопасности потоков.

KD-деревья имеют некоторые основные преимущества перед наивным подходом Dictionary {Key1, Dictionary {Key2, Value}} , а именно, что вы можете искать для всех полей на основе Key2 без знания Key1. Кроме того, KD-деревья позволяют вам искать ключи, которые находятся рядом с некоторым другим ключом. Например, сайты знакомств классифицируют людей по десяткам групп (курильщики / некурящие, пол, религия, образ жизни, возраст, рост), а затем возвращают ближайших соседей на основе вашего запроса.

Вот реализация C # и Java:

http: //home.wlu.edu/~levys/software/kd/

12
ответ дан 28 November 2019 в 00:08
поделиться

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

И наоборот, если у вас несколько индексов одного и того же типа, вы можете просто добавить один и тот же элемент несколько раз.

Словарь будет поддерживать что-то с индексом GUID, а также с индексом простого имени " Джо "- не забудьте добавить элемент дважды.

5
ответ дан 28 November 2019 в 00:08
поделиться

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

Плюсы:

  • Можно искать оба ключа за один поиск.
  • Новый код не требуется.
  • Масштабируется до любого количества ключей.

Недостатки:

  • Терять безопасность типов, если ключи относятся к разным типам.
  • Невозможно перебрать кортежи (ключ1, ключ2, значение).
  • Значения появляются дважды, поэтому size () удваивается.
2
ответ дан 28 November 2019 в 00:08
поделиться

Вы думали о том, чтобы иметь два словаря, по одному для каждого ключа? Добавление элемента добавит его к обоим.

Удаление означает также удаление из обоих словарей и требует обоих ключей. Чтобы удалить только одним ключом, элемент должен хранить оба ключа. Если он еще не содержит оба ключа, вы можете обернуть его в объект-контейнер, содержащий оба ключа и элемент.

1
ответ дан 28 November 2019 в 00:08
поделиться

Два словаря, но не дублируйте элементы в каждом.

У вас будет словарь значений и словарь ключей.

Когда вы вызываете свой метод добавления, вы сгенерирует GUID и добавит его вместе с ключом в словарь ключей.

Затем используйте GUID в качестве ключа к словарю значений.

Если вы хотите добавить два ключа, вы добавите еще один элемент в словарь ключей с тем же идентификатором GUID.

Конечно, это означает, что каждый поиск требует двух проверок данных, но никогда больше, даже если у вас есть 50 ключей для одного и того же значения.

Найдите guid на основе ключа из таблицу ключей, затем найдите данные на основе этого идентификатора в таблице значений.

0
ответ дан 28 November 2019 в 00:08
поделиться

Возможно, вариант:

Сделайте, как предлагает Джон Кугельман, просто добавьте элемент дважды в один и тот же словарь. Затем у вас есть второй словарь, который сопоставляет значения с наборами ключей.

Когда вы добавляете пару ключ-значение, вы просто добавляете ее как обычно в первый словарь, а затем извлекаете набор ключей, принадлежащих этому значению, из второго словаря и добавляете ключ.

Dictionary dict1;
Dictionary > dict2;

Удаление значения выполняется путем извлечения набора ключей из dict2 и удаления их по одному из dict1.

Количество ключей: dict1. Count и количество значений dict2.Count

2
ответ дан 28 November 2019 в 00:08
поделиться

Я написал такой словарь и разместил его в моем блоге . Он предоставит вам приятный API вроде этого:

DoubleKeyDictionary<int, string, string> books = new DoubleKeyDictionary<string, string, string>();
bookListEx.Add(1, “21/12/2009″, “Lord of the Rings - Fellowship of the Ring”); 

Вы также можете использовать "Equals" для двух словарей и для каждого из них.

Обратите внимание, что в коде есть по крайней мере одна ошибка (обнаруженная в комментариях) и нет модульных тестов и т. Д. Когда (да!) У меня будет время, я обновлю код с модульные тесты ...

0
ответ дан 28 November 2019 в 00:08
поделиться

А как насчет мультииндексного контейнера , вдохновленного ускорением ??

Взгляните на CodeProject .

0
ответ дан 28 November 2019 в 00:08
поделиться

Создание простого класса для хранения Tkey1, TKey2, TValue, создание списка из них и использование LINQ для запроса такой структуры было бы вариантом.

0
ответ дан 28 November 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: