2013-11-21 2 views
3

В настоящее время я получаю список объектов List<NprDto> (класс NprDto содержит accountId, theDate1 и theDate2) из ​​запроса, который возвращает результаты, в которых NprDto имеет дубликаты учетных записей. Мне нужно иметь List<NproDto> только уникальных учетных записей, но сохранить объект. Это нужно только добавить первую учетную запись, если она встретится, и проигнорировать остальные.Java Как сохранить уникальные значения в списке объектов

Я сейчас пытаюсь это:

private List<NprDto> getUniqueAccountList(List<NprDto> nonUniqueAccountList) throws Exception { 

    Map<Long,NprDto> uniqueAccountsMapList = new HashMap<Long,NprDto>(); 
    List<NprDto> uniqueAccountsList = null; 

    if(nonUniqueAccountList != null && !nonUniqueAccountList.isEmpty()) { 
     for(NprDto nprDto : nonUniqueAccountList) { 
      uniqueAccountsMapList.put(Long.valueOf(nprDto.getAccountId()), nprDto); 
     } 
    } 

    uniqueAccountsList = new ArrayList<NprDto>(uniqueAccountsMapList.values()); 

    return uniqueAccountsList; 

} 

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

Любая помощь была бы принята с благодарностью.

+0

У вас есть уникальные номера счетов? Я думаю, что ваш дизайн хорош (экономит много работы, необходимой для создания набора), и ваш код тоже выглядит хорошо. Я держу пари, что твоя проблема в другом месте. – RalphChapin

+0

У меня был оператор вывода в неправильном месте. Все работает нормально. Благодаря! – Richard

ответ

10

Мне нужен Список уникальных учетных записей, но сохраняйте объект .

Вы должны использовать Set<NprDto>. Для этого вам необходимо переопределить equals и hasCode по классу NproDto.

class NprDto{ 
    Long accountId; 
    ....... 

@Override 
public boolean equals(Object obj) { 
    NproDto other=(NproDto) obj; 
    return this.accountId==other.accountId; 
} 

@Override 
public int hashCode() { 
    return accountId.hashCode(); 
} 
} 

Изменить getUniqueAccountList следующим образом:

private Set<NprDto> getUniqueAccountSet(){  
    Map<Long,NprDto> uniqueAccountsMapList = new HashMap<Long,NprDto>(); 
    Set<NprDto> uniqueAccs = new HashSet<NprDto>(uniqueAccountsMapList.values());  
    return uniqueAccs; 
} 
-1

Что вам нужно сделать, это реализовать методы equals, hashCode и compareTo для NprDto, чтобы соответствовать двум объектам как равных, когда их ID является одна и та же. После этого вы можете фильтровать все дубликаты так же легко, как это:

private List<NprDto> getUniqueAccountList(List<NprDto> nonUniqueAccountList) { 
    return new ArrayList<NprDto>(new LinkedHashSet<NprDto>(nonUniqueAccountList)); 
} 
0

На самом деле вам нужно реализующий равных и метод hascode, это будет хорошо для вас

Remove duplicates from a list

Java Набор содержит уникальное значение, но его несортированной коллекции. Список сортирует коллекцию, но содержит дубликаты объектов.

5

Что вам нужно, это LinkedHashSet. Он удаляет дубликаты и сохраняет порядок вставки. Вы не необходимо TreeSet здесь, потому что он сортирует и изменяет порядок оригинала List.

Если сохранение порядка вставки не имеет значения, используйте HashSet.

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