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

Find all the years in a list of dates

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

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"...]

使用子字符串将每个项目的前 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);

How do I remove repeated elements from ArrayList?

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

   for (String date : dates) {
         String year = date.substring(0,5);
         if(!years.contain(year)){
             years.add(year); 
         }else{
             //already in the list
         }
    }
List<String> years = dates.stream()
    .map(x -> x.substring(0, 4))
    .distinct()
    .collect(Collectors.toList());
  • 对于每个条目,您只需要前 4 个字符(您甚至可以将字符串解析为日期,然后只获取年份)
  • 之后,您可以清楚地获取每个值(无重复)
  • 然后您将该流收集到列表中

java.time

我建议您使用现代日期时间 API。根据您的要求,您可以获得 IntegerStringYear 等形式的年份列表

演示:

import java.time.LocalDate;
import java.time.Year;
import java.util.List;
import java.util.stream.Collectors;

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]

ONLINE DEMO

请注意,您的所有日期字符串均采用 ISO 8601 格式。现代日期时间 API 基于 ISO 8601 并且不需要明确使用 DateTimeFormatter 对象,只要日期时间字符串符合 ISO 8601 标准。

了解有关 modern Date-Time API* from Trail: Date Time 的更多信息。

注:

如果您需要独特的年份集合,请在收集 Stream 之前使用 .distinct(),例如

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

输出:

[2012, 2013, 2010]

ONLINE DEMO


* 如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time