在日期列表中查找所有年份

问题描述 投票:0回答:4

所以,我有一个类似这样的日期列表:

List<String> dates = ["2012-05-16", "2012-05-18", "2012-06-19", "2013-01-18", "2013-01-10", "2013-08-05", "2010-07-10"...]

该列表包含大约 100 个日期,我想检索列表中存在的所有年份。 (得到这样的结果)

List<String> years = ["2012", "2013", "2010"...]
java android list date java-time
4个回答
3
投票

使用子字符串将每个项目的前 4 个字符拆分出来。它会给你留下年份

   for (String s : dates) {
         String year = s.subString(0,5);
         years.add(year);

      }

或者你可以使用 .split() 方法

String year =  s.split("-")[0];

编辑

进一步澄清后,问题是在数组列表中获取唯一的年份。

这可以通过将数组列表传递到不接受重复值的集合中,然后将集合传递回数组来完成

// add elements to al, including duplicates
Set<String> hs = new HashSet<>();
hs.addAll(years);
years.clear();
years.addAll(hs);

来自 如何从 ArrayList 中删除重复元素?


0
投票

您可以在添加到列表之前检查重复项(或者您可以使用集合而不是列表)。

   for (String date : dates) {
         String year = date.substring(0,5);
         if(!years.contain(year)){
             years.add(year); 
         }else{
             //already in the list
         }
    }

0
投票
List<String> years = dates.stream()
    .map(x -> x.substring(0, 4))
    .distinct()
    .collect(Collectors.toList());
  • 对于每个条目,您只需要前 4 个字符(您甚至可以将字符串解析为日期,然后您只需获取年份)
  • 之后,您可以清楚地获取每个值(没有重复)
  • 然后您将该流收集到列表中

0
投票

java.time

我建议您使用现代的日期时间 API 来完成此操作。根据您的要求,您可以获得

Integer
String
Year
等形式的年份列表。

演示:

public class Main {
    public static void main(String[] args) {
        List<String> dates = List.of("2012-05-16", "2012-05-18", "2012-06-19", 
                "2013-01-18", "2013-01-10", "2013-08-05",   "2010-07-10");

        List<Integer> yearsIntList = 
                dates.stream()
                    .map(LocalDate::parse)
                    .map(d -> d.getYear())
                    .collect(Collectors.toList());

        List<String> yearsStrList =
                dates.stream()
                    .map(LocalDate::parse)
                    .map(d -> String.valueOf(d.getYear()))
                    .collect(Collectors.toList());

        List<Year> yearsYearList = 
                dates.stream()
                    .map(LocalDate::parse)
                    .map(d -> Year.of(d.getYear()))
                    .collect(Collectors.toList());

        System.out.println(yearsIntList);
        System.out.println(yearsStrList);
        System.out.println(yearsYearList);
    }
}

输出:

[2012, 2012, 2012, 2013, 2013, 2013, 2010]
[2012, 2012, 2012, 2013, 2013, 2013, 2010]
[2012, 2012, 2012, 2013, 2013, 2013, 2010]

在线演示

请注意,所有日期字符串均采用 ISO 8601 格式。现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要显式使用

DateTimeFormatter
对象。

Trail:日期时间了解有关 现代日期时间 API *的更多信息。

注:

如果您需要独特的年份集合,例如

,请在收集 
.distinct()
 之前使用 
Stream

List<String> yearsStrList = 
    dates.stream()
        .map(LocalDate::parse)
        .map(d -> String.valueOf(d.getYear()))
        .distinct()
        .collect(Collectors.toList());

输出:

[2012, 2013, 2010]

在线演示


* 如果您正在从事 Android 项目,并且您的 Android API 级别仍然不符合 Java-8,请检查 通过脱糖可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供了对 java.time

支持。

© www.soinside.com 2019 - 2024. All rights reserved.