当前位置: 首页 > 知识库问答 >
问题:

从列表中获取最年轻的人,其中Person在字符串ISO8601 fromat中有出生日期

高慈
2023-03-14
class Person{
String name;
String id;
String dateOfBirth;
int salary;
}

List <Person> listOfPersons; //consider that list is filled with some data

e、 g.<代码>出生日期=“2018-12-10T13:49:51.141Z”

出生日期在ISO8601中,可以转换为java.util.DatewithDate.from(Instant.parse(dateOfBirth));如果这有助于对列表进行排序。

那么,是否有任何方法可以使用JAVA 8中的streams或nice解决方案从人员列表中获取最年轻的人员?

附加注释:无法更改Person类。

共有3个答案

刘凡
2023-03-14

UTC ISO-8601日期字符串可以按字典进行比较。因此,我认为最优雅的Java 8解决方案是:

Person youngest = listOfPersons.stream()
    .max(Comparator.comparing(p -> p.dateOfBirth)).get();

如果您不信任字符串比较,或者您的时区到处都是,如果您愿意,可以解析日期:

Person youngest = listOfPersons.stream()
    .max(Comparator.comparing(p -> LocalDateTime.parse(p.dateOfBirth))).get();

请注意,您可能应该使用LocalDateTime,而不是Date,因为Java 8已经脱离了旧的日期/时间API(这里有一个很好的概述)。

此处是可运行的示例。

感兴趣的API:

  • 流是Java 8的一种。。。iterable转换接口支持许多方便的方法和方法链接。所有集合对象都有一个用于获取流的成员

所以在上面的代码中:

  • <代码>p-

完整示例(链接到上面的ideone):

import java.util.*;
import java.lang.*;
import java.io.*;
import java.time.*;

class Ideone {

    public static void main (String[] args) throws java.lang.Exception {
        
        Person youngest;
        
        // you could do string comparison if you know the timezones are consistent:
        
        youngest = listOfPersons.stream()
            .max(Comparator.comparing(p -> p.dateOfBirth)).get();
        
        System.out.println("youngest is: " + youngest.name + " " + youngest.dateOfBirth);

        // or you could just parse the date, a safer option:
        
        youngest = listOfPersons.stream()
            .max(Comparator.comparing(p -> LocalDateTime.parse(p.dateOfBirth))).get();
        
        System.out.println("youngest is: " + youngest.name + " " + youngest.dateOfBirth);
        
    }

    
    //------------------------------------
    // types from OP:
    
    static class Person{
        String name;
        String id;
        String dateOfBirth;
        int salary;
    }

    static List <Person> listOfPersons;

    
    //------------------------------------
    // boring example data initialization:
    
    // make an iso birthdate string given an age (for initializing data)
    static String fromAge (int years) {
        return LocalDateTime.now().minusYears(years).toString(); // ISO8601
    }
    
    // make up some data
    static {
        listOfPersons = List.of(
            // fine for example, but i wouldn't init like this in production
            new Person() {{ name="helga"; dateOfBirth=fromAge(22); }},
            new Person() {{ name="mortimer"; dateOfBirth=fromAge(48); }},
            new Person() {{ name="gertrude"; dateOfBirth=fromAge(6); }},
            new Person() {{ name="jebediah"; dateOfBirth=fromAge(39); }}
        );
        listOfPersons.forEach(p -> System.out.println(p.name + ' ' + p.dateOfBirth));
    }

    
}

输出:

helga 2000-06-22T14:56:39.329972
mortimer 1974-06-22T14:56:39.330483
gertrude 2016-06-22T14:56:39.331082
jebediah 1983-06-22T14:56:39.331653
youngest is: gertrude 2016-06-22T14:56:39.331082
youngest is: gertrude 2016-06-22T14:56:39.331082
聂奇
2023-03-14

按照其他人的建议,使用LocalDateTimeLocalDateTime具有非常方便的功能,完全适合您的问题。您可以直接将String解析为它,只需从ISO字符串中删除“Z”,您就可以了:

LocalDateTime someBirthday = LocalDateTime.parse("2018-12-10T13:49:51.141");

下一步,编写比较器:

public class BirthdayComparator implements Comparator<LocalDateTime> {

    @Override
    public int compare(LocalDateTime date1, LocalDateTime date2) {
        if(date1.isAfter(date2)) {
            return 1;
        } else if (date1.equals(date2)) {
            return 0;
        } else {
            return -1;
        }
    }
}

就是这样。现在可以对出生日期进行排序。

更新

最后提醒一句:此代码忽略时区。准确地说,它隐含地假设所有给定的生日都在同一时区。如果您必须与全球各地的人打交道,这可能会有问题......

南宫森
2023-03-14

你可以这样做

Person youngestPerson = listOfPersons.stream()
.reduce((p1, p2) -> LocalDateTime.parse(p1.getStringDateofBirth()).isAfter(LocalDateTime.parse(p2.getStringDateofBirth()))?p1:p2)
.orElse(null)
 类似资料:
  • 问题内容: 即时通讯正在处理日期,并且我在从字符串中获取日期时遇到问题,我在这里简化了我的问题: 输出为:“ 25-05-2015”(可以),“ 2014年12月21日,上午12:00”(???) 问题答案: 那里的问题是为了。您必须使用。顺便说一句,不要忘记将日期格式设置的语言环境设置为“ en_US_POSIX” 。 如果您使用固定格式的日期,则应首先将日期格式器的语言环境设置为适合您的固定格

  • 问题内容: 我有一个日期时间对象列表,我想找到最早的或最小的对象。其中一些日期可能在将来。 最佳方法是什么?我当时正在考虑将datetime.now()与其中的每一个进行比较。 问题答案: 最老的: 现在最年轻:

  • 问题内容: 我在String上有个约会,像这样: 我想将其划分为: 做这个的最好方式是什么? 问题答案: 在Java中拆分字符串的一种方法是使用.split(“ regex”),该方法根据提供的模式拆分字符串,并返回String数组。 获取当前日期:您还可以通过更改传递给SimpleDateFormat的值来更改日期格式。不要忘记进口。

  • 问题内容: 我在python中有一个字符串。我需要将其转换为date对象,然后获取 year 以及 Julian day 的整数值。可能吗? 问题答案: 首先,您可以将其转换为这样的对象: 然后,您可以使用上的方法来获取所需的内容……除了没有直接所需的功能之外,因此您需要转换为时间元组 术语“朱利安日”具有几个不同的含义。如果要查找,则必须间接执行此操作,例如,以下一项。 如果您正在寻找不同的含义

  • 问题内容: 我正在做一个从列表中返回最长字符串值的函数。当只有一个包含最多字符的字符串时,我的代码有效。如果有多个字符串,我尝试使其打印所有最长的字符串,并且我不希望重复它们。当我运行它时,它只返回“ hello”,而我希望它也返回“ ohman”和“ yoloo”。我觉得问题就在眼前,但是我已经尝试了所有方法,但是没有用。 问题答案: 首先 ,我们可以在列表中找到任何字符串的最大长度: 一点解释

  • 我想像下面这样拆分这个字符串: {“我喜欢一个”、“橘子”、“以及”、“苹果”、“但主要是”、“苹果”、“苹果”,“苹果”,“橘子”,“是最好的水果。”} 在上面,我已经拆分了基于水果橙和苹果的字符串,但这两个水果也是子字符串列表的一部分。