Двойные ценности в коллекции Набора?

Действительно ли возможно позволить двойные ценности в коллекции Набора?

Там какой-либо путь состоит в том, чтобы сделать элементы уникальными и иметь некоторые копии их? Есть ли какие-либо функции для коллекции Набора для того, чтобы иметь двойные ценности в нем?

9
задан Johanna 21 January 2010 в 21:05
поделиться

9 ответов

[1127445-

, когда-либо с учетом использования Java.util.list вместо этого?

В противном случае я бы порекомендовал MultiSet из Google Guava ] (преемник коллекции Google , который этот ответ изначально рекомендовал.).

26
ответ дан 4 December 2019 в 06:11
поделиться

Я так не думаю. Единственный способ использовать список. Вы также можете трюк с функцией равняться (), Hashcode () или Companeto (), но это будет явным.

-121--3211968-

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

Есть ли способ сделать элементы уникальными и иметь некоторые копии из них?

Если по какой-то причине вы действительно делают , нужно хранить дубликаты в наборе, вам понравится обернуть их в каком-то веществе владельца или переопределяют равному () и hashcode () ваших моделей объектов, чтобы они не оценивали как эквивалентные (и даже , что потерпит неудачу, если вы пытаетесь хранить ссылки на ссылки на тот же физический объект несколько раз).

Я думаю, что вам нужно переоценить, что вы пытаетесь сделать здесь, или, по крайней мере, объясните нам более четко.

12
ответ дан 4 December 2019 в 06:11
поделиться

Из Javadocs:

«Наборы не содержат пары элементов E1 и E2 такое, что E1.equals (E2), а в Большинство NULL элемент

, поэтому, если ваши объекты должны были переопределить. Equals () так, чтобы он вернул разные значения для любых объектов, которые вы намереваетесь хранить, то вы можете хранить их отдельно в SET (вы также должны переопределить hashcode (), а также).

Однако очень определение набора в Java есть,

«Коллекция, которая не содержит no Дублирующие элементы. «

Так что вы действительно лучше используете список или что-то еще здесь. Возможно, карта , если вы хотите хранить дубликаты значений на основе разных клавиш.

2
ответ дан 4 December 2019 в 06:11
поделиться

Вид Солнца на «Сумки» (AKA MultiSets):

Мы чрезвычайно сочувствуем желанию для безопасных коллекций типа. Вместо добавления «полосовой помощи» в рамках, которые обеспечивают безопасность типа в специальной моде, структура была разработана для сетки со всеми предложениями параметризованных типов, которые в настоящее время обсуждаются. В случае, если на языке добавляются параметризованные типы, все основы коллекции будут поддерживать использование типа компиляции-временного типа, без необходимости явных отливок. К сожалению, это не произойдет в выпуске 1.2. Тем временем люди, которые желают безопасностью типа выполнения, могут реализовать свои собственные функции Gating в «Wrapper», связанные с коллекциями JDK.

( Источник ; Обратите внимание, что это старое и, возможно, устарело.)

Помимо коллекций Google API, вы можете использовать коллекции Apache Commons.

Коллекции Apache Commons:

http://commons.apache.org/collections/

Javadoc для мешок

2
ответ дан 4 December 2019 в 06:11
поделиться

Я не верю, что вы можете иметь дублирующие значения в пределах набора. Набор определяется как набор уникальных значений. Вам может быть лучше, используя ArrayList.

1
ответ дан 4 December 2019 в 06:11
поделиться
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$ 
-121--603642-

для lolz

Array.Sort(array, ((x,y) => (int.Parse(x.Split('|')[0]) < int.Parse(y.Split('|')[0])) ? -1 : (int.Parse(x.Split('|')[0]) > int.Parse(y.Split('|')[0])) ? 1 : 0));
-121--4577904-

Я так не думаю. Единственный способ - использовать список. Вы также можете хитрость с функцией equals (), hashcode () или compeyTo (), но это будет ankward.

0
ответ дан 4 December 2019 в 06:11
поделиться

Нет шансов .... Вы не можете иметь дубликаты значений в Set Interface ... Если вы хотите дубликаты, вы можете попробовать массив-список

0
ответ дан 4 December 2019 в 06:11
поделиться

Как уже упоминалось выбрать правильную коллекцию для задачи и, вероятно, список будет то, что вам нужно. Воспитание с равными (), hashcode () или companeto (), чтобы нарушить личность, как правило, является плохой идеей, просто чтобы просто клин экземпляра в неправильную коллекцию для начала. Хуже того, что это может сломать код в других областях приложения, которые зависят от этих методов, создающих допустимые результаты сравнения и очень сложно отладить или отслеживать такие ошибки.

0
ответ дан 4 December 2019 в 06:11
поделиться

Этот вопрос мне также задавали в интервью.Я думаю, что ответ: конечно, Set не допускает дублирования элементов, и вместо этого для них следует использовать ArrayList или другие коллекции, однако переопределение equals () для типа объекта, хранящегося в наборе, позволит вам управлять сравнением логика. И, следовательно, вы можете хранить повторяющиеся элементы в Set. Это больше похоже на хакер, который позволяет использовать неуникальные элементы в наборе и, конечно же, не рекомендуется в коде производственного уровня.

0
ответ дан 4 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

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