2013-07-12 6 views
7

Я хочу сделать что-то вродеСоздание набора Массивы в Java

Set <String[]> strSet = new HashSet <String[]>(); 

Есть простой способ сделать набор массивов в Java, или у меня есть код собственную реализацию? Добавление объекта в Set проверяет объект с помощью equals(), который не работает для массивов.

ответ

12

Arrays не переоценивает equals и hashCode, и поэтому HashSet будет сравнивать их только на основе ссылочного равенства. Рассмотрите возможность использования List сек вместо:

Set<List<String>> strSet = new HashSet<List<String>>(); 

Из документации List.equals:

Возвращает true тогда и только тогда, когда указанный объект также список, оба списка имеют одинаковый размер, и все соответствующие пары элементы в этих двух списках: =.

+0

Это, вероятно, лучшее решение для этого. – Chase

+3

некоторый набор не использует equals и hashCode, как sortedset "..Arrays не переопределяет equals и hashCode, и поэтому Set будет c .." должен быть HashSet вместо установленного – nachokk

+0

@nachokk Хороший улов - спасибо. –

6

Использовать Set<List<String>>. При необходимости вы можете использовать Arrays.asList и List.toArray для конверсий.

+2

+1 Для упоминания 'Arrays.asList' (который представляет собой простое представление« Список »массива поддержки). –

0

Если вам действительно нужно Set<String[]>, для этого нет простого и элегантного способа, AFAICT. Проблема в том, что массивы не перекрывают equals() и hashCode(), с одной стороны. С другой стороны, класс HashSet не дает возможности передать некоторую «стратегию» для него, которая будет реализовывать хэш-код и вычисление равенства извне (что-то вроде Comparator). Таким образом, вы можете подумать о создании TreeSet с помощью специализированного компаратора. К сожалению, я не знаю никакой реализации компаратора массивов, поэтому, скорее всего, вам нужно будет написать свой собственный.

Если это нормально, у вас есть Set<List<String>>, вы можете рассмотреть совет в других ответах.

Смежные вопросы