排序算法嵌套对象



各位java高手,我是一个java开发新手,请帮助我编写一个排序算法,用于嵌套在另一个对象中的对象,但同时必须考虑到主对象的字段

主要对象:

public class Review {
String date;
Update update;
}

更新对象:

public class Update {
String date;
}

我的错误算法:

public class Test {
public static void main(String[] args) {
Review review = new Review();
Update update = new Update();
update.date = LocalDateTime.now().toString();
review.date = LocalDateTime.now().minusDays(20L).toString();
review.update = update;
Review review1 = new Review();
Update update1 = new Update();
update1.date = LocalDateTime.now().minusDays(5L).toString();
review1.date = LocalDateTime.now().minusDays(30L).toString();
review1.update = update1;
Review review10 = new Review();
Update update10 = new Update();
update10.date = LocalDateTime.now().minusDays(1L).toString();
review10.date = LocalDateTime.now().minusDays(100L).toString();
review10.update = update10;
Review review2 = new Review();
review2.date = LocalDateTime.now().minusDays(40L).toString();
Review review3 = new Review();
review3.date = LocalDateTime.now().minusDays(50L).toString();
Review review4 = new Review();
review4.date = LocalDateTime.now().minusDays(2L).toString();
List<Review> reviews = List.of(review, review1, review2, review3, review4, review10);
Comparator<Review> reviewComparator = Comparator.comparing(review5 -> review5.date);
System.out.println(reviews = reviews.stream().sorted(reviewComparator.reversed()).collect(Collectors.toList()));
for (int i = 0; i < reviews.size(); i++) {
Review review5 = reviews.get(i);
for (int z = 1; z < reviews.size(); z++) {
if (z >= i) {
Review review6 = reviews.get(z);
if (review6.update != null) {
LocalDateTime date1 = LocalDateTime.parse(review6.update.date);
LocalDateTime date2 = LocalDateTime.parse(review5.date);
int i1 = date1.compareTo(date2);
if (i1 > 0) {
reviews.remove(review6);
reviews.add(i, review6);
} else if (review5.update != null) {
LocalDateTime date3 = LocalDateTime.parse(review6.update.date);
LocalDateTime date4 = LocalDateTime.parse(review5.update.date);
int i2 = date3.compareTo(date4);
if (i2 > 0) {
reviews.remove(review6);
reviews.add(i, review6);
}
}
}
}
}
}
System.out.println(reviews);
}
}

和结果:

[
Review{date='2022-10-11T13:17:01.754934500', update=Update{date='2023-01-18T13:17:01.754934500'}}, 
Review{date='2022-12-20T13:17:01.754934500', update=Update{date='2023-01-14T13:17:01.754934500'}}, 
Review{date='2022-12-30T13:17:01.754934500', update=Update{date='2023-01-19T13:17:01.753935600'}}, 
Review{date='2023-01-17T13:17:01.754934500', update=null}, 
Review{date='2022-12-10T13:17:01.754934500', update=null}, 
Review{date='2022-11-30T13:17:01.754934500', update=null}
]

我希望:

[
Review{date='2022-12-30T13:17:01.754934500', update=Update{date='2023-01-19T13:17:01.753935600'}}, 
Review{date='2022-10-11T13:17:01.754934500', update=Update{date='2023-01-18T13:17:01.754934500'}}, 
Review{date='2023-01-17T13:17:01.754934500', update=null}, 
Review{date='2022-12-20T13:17:01.754934500', update=Update{date='2023-01-14T13:17:01.754934500'}}, 
Review{date='2022-12-10T13:17:01.754934500', update=null}, 
Review{date='2022-11-30T13:17:01.754934500', update=null}
]

如果存在,您想按Review.update.date排序,如果不存在,则按Review.date排序?

你可以在传递给Comparator.comparing(...)的键提取器函数中添加映射:

Comparator.comparing(r -> r.update != null ? r.update.date : r.date);

将此与Collections.sort(reviews, reviewComparator.reversed());一起使用应该会产生以下列表(我添加了自己的toString以使其更易于阅读):

Review [date=2022-12-30T12:13:27.102934100, update=2023-01-19T12:13:27.096938200]
Review [date=2022-10-11T12:13:27.103934400, update=2023-01-18T12:13:27.103934400]
Review [date=2023-01-17T12:13:27.103934400, update=null]
Review [date=2022-12-20T12:13:27.102934100, update=2023-01-14T12:13:27.102934100]
Review [date=2022-12-10T12:13:27.103934400, update=null]
Review [date=2022-11-30T12:13:27.103934400, update=null]

注意:根据您的设计,在Review中添加一个返回上次审查日期的方法可能是有意义的。我不会改变太多的代码(如使用适当的日期类型),但它可能看起来像这样:

public class Review {
String date; //creation date
Update update;
public String getLastReviewDate() {
return update != null ? update.date : date;
}
}

那么比较器看起来像这样:Comparator.comparing(Review::getLastReviewDate)。排序是基于虚拟属性"最后一次审查日期"的,这样更容易阅读和理解。

最新更新