【问题标题】:How to remove duplicate custom object from List?如何从列表中删除重复的自定义对象?
【发布时间】:2018-02-04 04:54:44
【问题描述】:

我有一个List<MyDTO>。它具有projName,projID,projReleaseDate,comments 等属性。我想创建一个新的列表对象List<Timestamp>,我必须在其中存储所有 projReleaseDates 而不重复。

我开始尝试下面的代码,但无法继续..

List<Timestamp> datesList = new ArrayList<Timestamp>();
List<MyDTO> myDTOList = getInformation();

for(MyDTO dtoList : myDTOList){

//dtoList.getProjReleaseDate(); //return the release date

}

如何将 projReleaseDates 存储在新的 List 对象(datesList) 中而不重复。我如何知道当前对象值和以前的对象值相同?

【问题讨论】:

  • 回答您的最后一个问题:您可以使用List#contains 进行检查。但请注意,这种方法非常慢,对于ArrayList,它会从左到右遍历所有元素,直到结果清晰为止。这种数据结构不是为 contains 查询而设计的。它提供快速随机访问(每个索引)。

标签: java list arraylist collections


【解决方案1】:

没有。不要接受List。使用Set 以消除欺骗。

Set<Timestamp> datesList = new HashSet<Timestamp>();
List<MyDTO> myDTOList = getInformation();

for(MyDTO dtoList : myDTOList){

  datesList.add(dtoList.getProjReleaseDate()); 
}

【讨论】:

    【解决方案2】:

    如果你想省略重复并保持插入顺序,你可以使用LinkedHashSet,确保你已经正确覆盖了equalshashCode方法

            Set<Timestamp> results = myDTOList
                    .stream()
                    .map(MyDTO::getProjReleaseDate)
                    .filter(Objects::nonNull)
                    .collect(LinkedHashSet::new, Set::add, Set::addAll);
    

    List 流与distinct() 一起使用[效率低于Set]

            List<Timestamp> result = myDTOList
                    .stream()
                    .map(MyDTO::getProjReleaseDate)
                    .filter(Objects::nonNull)
                    .distinct()
                    .collect(Collectors.toList());
    

    【讨论】:

    • 当我使用java8来实现这一点时,我可以检查空值并省略将空值添加到Set中吗,因为很少有项目有空值..
    【解决方案3】:

    你应该改用Set,它可以在Java 8中使用流在一行中完成,

    Set<Timestamp> results = myDTOList
                             .stream()
                             .map(MyDTO::getProjReleaseDate)
                             .collect(Collectors.toSet());
    

    【讨论】:

    • 感谢所有输入。刚刚意识到我不能在 java 端完成,我必须在 js 端做同样的事情 stackoverflow.com/questions/48605273/… 。有输入吗?
    • @user8115347 那么您的问题无效,也没有答案
    【解决方案4】:

    如您所见,List 类允许重复。 Set (documentation) 类却没有,它非常适合您的需求。

    请注意,您会丢失一组中的顺序。如果您需要维护订单,可以使用SortedSets,例如TreeSet (documentation)(用于特定订单)或LinkedHashSet (documentation)(用于广告订单)。

    您的代码可能如下所示:

    // Create set
    Set<Timestamp> dates = new HashSet<>();
    List<MyDTO> myDTOList = getInformation();
    
    for (MyDTO dtoList : myDTOList) {
        Timestamp ts = dtoList.getProjReleaseDate();
        // Add to set
        dates.add(ts);
    }
    

    或者,通过使用流式 API(从 Java 8 开始):

    Set<Timestamp> dates = getInformation().stream()  // Stream<MyDTO>
        .map(MyDTO::getProjReleaseDate)               // Stream<Timestamp>
        .collect(Collectors.toSet());                 // Set<Timestamp>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2015-12-22
      • 2016-10-15
      • 2015-07-10
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      相关资源
      最近更新 更多