所以,我有一个类似这样的日期列表:
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);
您可以在添加到列表之前检查重复项(或者您可以使用集合而不是列表)。
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());
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
的支持。