Почему я не могу получить элемент из HashSet без перечисления?

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

Для браузеров, которые не поддерживают svg, вы можете дать телу класс «no-svg».

В вашем CSS просто добавьте '.no-svg .yourimageclass' и вместо этого поместите png. (переопределите его)

Boilerplate HTML5 дает вам этот класс no-svg уже по умолчанию с некоторой магией javascript. (например, для IE8)

33
задан sooniln 29 September 2009 в 21:40
поделиться

6 ответов

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

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

РЕДАКТИРОВАТЬ: Дополнительно ответ основан на редактировании исходного вопроса

Soonil, основываясь на вашей новой информации, похоже, что вас может заинтересовать реализация ваших данных как Java Enum, что-то вроде этого:

 public enum SoonilsDataType {
      A, B, C;

      // Just an example of what's possible
      public static SoonilsDataType getCompositeValue(SoonilsDataType item1,
           SoonilsDataType item2) {
           if (item1.equals(A) && 
                     item2.equals(B)) {
                return C;
           }
      }
 }

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

s автоматически наследует values ​​(), который возвращает список всех значений в «наборе» перечисления, который вы можете использовать для проверки включения так же, как и набор. Кроме того, поскольку это полный класс, вы можете определять новые статические методы для выполнения составной логики (например, я пытался упомянуть в примере кода). Единственное, что касается Enum, это то, что вы не можете добавлять новые экземпляры во время выполнения, что может быть не тем, что вам нужно (хотя, если размер данных набора не будет расти во время выполнения, Enum - это то, что вам нужно).

s автоматически наследует values ​​(), который возвращает список всех значений в «наборе» перечисления, который вы можете использовать для проверки включения так же, как и набор. Кроме того, поскольку это полный класс, вы можете определить новые статические методы для выполнения составной логики (как я пытался упомянуть в примере кода). Единственное, что касается Enum, это то, что вы не можете добавлять новые экземпляры во время выполнения, что может быть не тем, что вам нужно (хотя, если размер данных набора не будет расти во время выполнения, Enum - это то, что вам нужно).

9
ответ дан 27 November 2019 в 19:28
поделиться

Если вы измените объект после того, как он был вставлен, его хеш мог измениться (это особенно вероятно, если hashCode () был переопределен). Если хеш изменится, его поиск в наборе не удастся, так как вы попытаетесь найти объект, хэшированный в другом месте, чем он хранится.

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

Обратите внимание, что это все для Java - я предполагаю, что в C # есть что-то похожее, но поскольку прошло несколько лет с тех пор, как я использовал C #, я позволит другим говорить с его возможностями.

4
ответ дан 27 November 2019 в 19:28
поделиться

Я полагаю, что разработчики интерфейса Set и класса HashSet хотели убедиться, что метод remove (Object) определен в коллекции Интерфейс также применим к Set ; этот метод возвращает логическое значение, указывающее, был ли объект успешно удален. Если дизайнеры хотели предоставить функциональность, посредством которой remove (Object) возвращал «равно» объект уже в Установить это означало бы другой метод подписи.

Кроме того, учитывая, что объект удаляется логически равен объекту передается удалить (Object) можно утверждать о добавленной стоимости возвращает содержащийся объект. Однако у меня раньше была эта проблема, и я использовал карту для ее решения.

Обратите внимание, что в Java HashSet использует внутри HashMap , поэтому нет t дополнительные накладные расходы на хранилище при использовании вместо него HashMap .

3
ответ дан 27 November 2019 в 19:28
поделиться

По-моему, вы действительно ищете Map , где Y - это тип extra1 .


(разглагольствование ниже)

Методы equals и hashCode определяют значимое равенство объектов. Класс HashSet предполагает, что если два объекта равны, как определено в Object.

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

Объекты набора на этих языках в основном разрабатывались как набор значений, а не для изменяемых объектов. Они проверяют, что помещенный в них объект уникален, используя равенства. Вот почему contains и remove возвращает логическое значение, а не объект: они проверяют или удаляют значение, которое вы им передаете.

И на самом деле, если вы выполняете contains (X) в наборе и ожидаете получить другой объект Y, это означает, что X и Y равны (т.е. X.equals (Y) => true), но несколько отличаются, что кажется неправильным.

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

Мне было дано интересное предложение относительно способа использования карты, когда мои собственные объекты определяют себя как KeyValuePairs. Хотя это хорошая концепция, к сожалению, KeyValuePair - это не интерфейс (почему бы и нет?), А структура, которая запускает этот план из воздуха. В конце я выберу свой собственный Сет, поскольку мои ограничения позволяют мне эту возможность.

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