2013-05-29 5 views
3

Я пытаюсь извлечь уникальные элементы из списка классов с форматом:Проблема получения уникальных элементов списка

[EntityClientPlayerMP['Player989'/228, l='MpServer', x=138.16, y=68.62, z=522.96], EntityCow['Cow'/231, l='MpServer', x=143.63, y=68.00, z=527.50]....] 

эти списки, как правило, имеют размер 60-100.

Метод, который я пытаюсь использовать в данный момент

List<Class> uniqueList = new ArrayList<Class>(new HashSet<Class>(fullList)); 

это возвращает тот же список, но отсортированный немного по-другому. Любые идеи о том, почему?

+0

Что вы подразумеваете под «отсортированным по-другому»? Можете ли вы привести пример? – chessbot

+0

Как выглядит класс 'Class'? (Я предполагаю, что вы не имеете в виду 'java.lang.Class'?) – ruakh

+0

Это очень похоже на« _I не реализовал проблему hashCode() и equals() _ ». – jahroy

ответ

2

Вы должны обеспечить правильное применение для equals() и hashcode()

2

Не забудьте переопределить методы equals() и hashCode() в каждом из классов сущностей (why?), в противном случае устройство не сможет правильно определить когда два элемента равны. Кроме того, я думаю, что вы имели в виду это:

List<EntityClientPlayerMP> uniqueList = 
    new ArrayList<EntityClientPlayerMP>(
     new LinkedHashSet<EntityClientPlayerMP>(fullList)); 

Теперь в приведенном выше фрагменте кода параметр типа является один, в частности (не Class, как показано в этом вопросе, заменить фактического типа по мере необходимости), а также с помощью LinkedHashSet мы убедитесь, что порядок в исходном списке сохранен.

+0

В списке примеров содержится не только 'EntityClientPlayerMP', но также и' EntityCow'. Предположительно, это подтипы типа «класса» OP. – Arend

+0

@Arend В этом случае вам нужен объект. – user949300

+0

Я имел в виду, очевидно, что ОП определил свой собственный тип 'Class', из которых' EntityClientPlayerMP' и 'EntityCow' являются подтипами. Конечно, это просто праздные спекуляции и вряд ли имеют отношение к вопросу (к вашему ответу на который мне нечего добавить). – Arend

3

Они упорядочены по-другому, потому что HashSet имеет «странный» заказ, основанный на хэш-коде Объектов. Чтобы сохранить порядок, используйте LinkedHashSet.

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

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