【问题标题】:Find all the years in a list of dates在日期列表中查找所有年份
【发布时间】:2017-01-24 15:46:38
【问题描述】:

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

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

【问题讨论】:

  • 同时添加您尝试过的代码。
  • 您使用什么语言?爪哇?
  • 是的,android studio 使用 java
  • Prera​​k,我没有尝试任何代码,因为我想不出办法

标签: java android list date java-time


【解决方案1】:

使用子字符串将每个项目的前 4 个字符分开。它会给你留下一年

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

      }

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

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

编辑

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

这可以通过将 arraylist 传递到不接受重复值的 Set 中,然后将 set 传递回数组中来完成

// 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?

【讨论】:

【解决方案2】:

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

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

【讨论】:

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

    【讨论】:

      【解决方案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,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter 对象。

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

      注意:

      如果您需要独特的年份集合,请在收集 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。请注意,Android 8.0 Oreo 已经提供了support for java.time

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多