如何从列表中删除重复的自定义对象?

时间:2018-02-04 04:54:44

标签: java list arraylist collections

我有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)中而不重复。我如何知道当前对象值和先前对象值是否相同?

4 个答案:

答案 0 :(得分:1)

没有。不要带List。拿一个Set来消除欺骗。

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

for(MyDTO dtoList : myDTOList){

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

答案 1 :(得分:0)

你应该使用Set,它可以使用stream在Java 8中以单行完成,

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

答案 2 :(得分:0)

正如您所注意到的,List类允许重复。 Setdocumentation)课程却没有,它非常适合您的愿望。

请注意,您丢失了套装中的订单。如果您需要维护订单,可以使用TreeSet LinkedHashSetSortedSet)(针对特定订单)或// 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); } documentation)(用于插入)顺序)。

您的代码可能如下所示:

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

或者,通过使用流API(自Java 8起):

/dissertation/* https://wjakethompson-dissertation.netlify.com/:splat 200

答案 3 :(得分:0)

如果您想省略重复项也维护广告订单顺序,可以使用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());