Java如何在对象列表中保留唯一值

时间:2013-11-21 16:25:58

标签: java list map unique

我目前正在从查询中检索对象列表List<NprDto>(NprDto类包含accountId,theDate1和theDate2),该查询返回NprDto具有重复accountIds的结果。我需要List<NproDto>只有唯一的accountIds但保留对象。它只需要添加它遇到的第一个accountId并忽略其余的。

我正在尝试这个:

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后,它只会拾取第一个对象。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:10)

  

我需要一个只有唯一帐户ID的列表,但保留   对象

您应该使用Set<NprDto>。为此,您需要在equals班级覆盖hasCodeNproDto

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 :(得分:6)

这里需要的是LinkedHashSet。它删除重复项并保持插入顺序。 您需要TreeSet,因为它会对原始List的顺序进行排序和更改。

如果保留插入顺序并不重要,请使用HashSet

答案 2 :(得分:0)

实际上你需要实现equals和hascode方法,这对你有好处

Remove duplicates from a list

Java Set包含Unique值但其未排序的集合。列表是已排序的集合,但包含重复项对象。

答案 3 :(得分:-1)

您需要做的是为equals实施hashCodecompareToNprDto方法,以便在ID相同时将两个对象相等。然后,您可以像这样简单地过滤所有重复项:

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