gpt4 book ai didi

java - 无法弄清楚如何以正确的顺序打印列表

转载 作者:行者123 更新时间:2023-12-02 13:31:03 27 4
gpt4 key购买 nike

基本上,我有一个对象数组列表,这些对象具有名称和开始日期,并且它们的初始顺序与以下内容类似:

弗兰克 1990 年 10 月 20 日

法案 1990 年 1 月 2 日

弗兰克 1990 年 2 月 2 日

约翰 1990 年 9 月 8 日

法案 1990 年 4 月 4 日

弗兰克 1990 年 5 月 1 日

我试图按照声明的名字顺序打印它们,然后按日期打印,例如,最终打印应该打印:

弗兰克 1990 年 1 月 1 日

弗兰克 1990 年 5 月 1 日

弗兰克 1990 年 10 月 20 日

法案 1990 年 1 月 2 日

法案 1990 年 4 月 4 日

约翰 1990 年 9 月 8 日

最佳答案

假设您的对象类如下所示:

private static class MyObject {

private final String name;
private final Date date;

private MyObject(String name, Date date) {
this.name = name;
this.date = date;
}

public String getName() {
return name;
}

public Date getDate() {
return date;
}
}

您可以使用以下方法打印您的对象:

@Test
public void printInOrder() {
List<MyObject> list = new ArrayList<>(); // List containing your objects
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 10, 20).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 1, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 2, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("John", Date.from(LocalDate.of(1990, 9, 8).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 4, 4).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 5, 1).atStartOfDay(ZoneId.systemDefault()).toInstant())));

list.stream()
.sorted(Comparator.comparing(MyObject::getName)
.thenComparing(Comparator.comparing(MyObject::getDate)))
.map(obj -> obj.getName() + " " + obj.getDate())
.forEach(System.out::println);
}

输出:

Bill Tue Jan 02 00:00:00 CET 1990
Bill Wed Apr 04 00:00:00 CEST 1990
Frank Fri Feb 02 00:00:00 CET 1990
Frank Tue May 01 00:00:00 CEST 1990
Frank Sat Oct 20 00:00:00 CET 1990
John Sat Sep 08 00:00:00 CEST 1990

<小时/>

这使用 Java 8 流和比较器链来对对象进行排序。比较器通过给定属性进行比较,thenComparing 用于链接它们。

<小时/>

更新:

由于我不确定我是否可能误解了您的意思,这里是以下情况的第二个版本:

您想要按名称排序,但要按照名称在原始列表中出现的顺序进行排序,因此最先出现的名称将排在最前面。

在这种情况下,您必须记住一个单独的临时列表(仅包含原始顺序的唯一名称)中的名称顺序,该列表随后可以在比较器内使用。

该列表是通过将原始列表转换为一个集合(因此只有唯一的名称)然后将该集合转换回一个列表(以便能够在比较器内使用 indexOf)来生成的.

@Test
public void printInOrder() {
List<MyObject> list = new ArrayList<>();
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 10, 20).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 1, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 2, 2).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("John", Date.from(LocalDate.of(1990, 9, 8).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Bill", Date.from(LocalDate.of(1990, 4, 4).atStartOfDay(ZoneId.systemDefault()).toInstant())));
list.add(new MyObject("Frank", Date.from(LocalDate.of(1990, 5, 1).atStartOfDay(ZoneId.systemDefault()).toInstant())));

List<String> declaredNameOrder = new ArrayList<>(list.stream()
.map(MyObject::getName)
.collect(Collectors.toCollection(LinkedHashSet::new)));

list.stream()
.sorted(Comparator.<MyObject>comparingInt(o -> declaredNameOrder.indexOf(o.getName()))
.thenComparing(Comparator.comparing(MyObject::getDate)))
.map(obj -> obj.getName() + " " + obj.getDate())
.forEach(System.out::println);
}

输出:

Frank Fri Feb 02 00:00:00 CET 1990
Frank Tue May 01 00:00:00 CEST 1990
Frank Sat Oct 20 00:00:00 CET 1990
Bill Tue Jan 02 00:00:00 CET 1990
Bill Wed Apr 04 00:00:00 CEST 1990
John Sat Sep 08 00:00:00 CEST 1990

关于java - 无法弄清楚如何以正确的顺序打印列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43176888/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com