旧的日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.time,modern date-time API*。
Java SE 8
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Map<String, Integer> unsorted = new HashMap<>();
unsorted.put("Dec2010", 1);
unsorted.put("Apr2010", 1);
unsorted.put("Feb2010", 0);
unsorted.put("Nov2010", 2);
unsorted.put("Mar2010", 0);
unsorted.put("Jun2010", 2);
unsorted.put("Sep2010", 1);
unsorted.put("May2010", 0);
unsorted.put("Oct2010", 1);
unsorted.put("Jul2010", 0);
unsorted.put("Aug2010", 0);
unsorted.put("Jan2010", 1);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMuuuu", Locale.ENGLISH);
Comparator<String> comparator = (s1, s2) -> YearMonth.parse(s1, dtf).compareTo(YearMonth.parse(s2, dtf));
Map<String, Integer> sorted = new TreeMap<>(comparator);
sorted.putAll(unsorted);
System.out.println(sorted);
}
}
输出:
{Jan2010=1, Feb2010=0, Mar2010=0, Apr2010=1, May2010=0, Jun2010=2, Jul2010=0, Aug2010=0, Sep2010=1, Oct2010=1, Nov2010=2, Dec2010=1}
从 Trail: Date Time 了解有关 modern date-time API* 的更多信息。
Java SE 9
Java SE 9 引入了Map.ofEntries,您可以使用它来初始化您的Map<String, Integer> unsorted。
import static java.util.Map.entry;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Map<String, Integer> unsorted = Map.ofEntries(
entry("Dec2010", 1),
entry("Apr2010", 1),
entry("Feb2010", 0),
entry("Nov2010", 2),
entry("Mar2010", 0),
entry("Jun2010", 2),
entry("Sep2010", 1),
entry("May2010", 0),
entry("Oct2010", 1),
entry("Jul2010", 0),
entry("Aug2010", 0),
entry("Jan2010", 1)
);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMuuuu", Locale.ENGLISH);
Comparator<String> comparator = (s1, s2) -> YearMonth.parse(s1, dtf).compareTo(YearMonth.parse(s2, dtf));
Map<String, Integer> sorted = new TreeMap<>(comparator);
sorted.putAll(unsorted);
System.out.println(sorted);
}
}
使用单个语句进行排序和映射:
您可以利用强大的Stream API(教程:1、2)来完成您的工作。
import static java.util.Map.entry;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Map<String, Integer> unsorted = Map.ofEntries(
entry("Dec2010", 1),
entry("Apr2010", 1),
entry("Feb2010", 0),
entry("Nov2010", 2),
entry("Mar2010", 0),
entry("Jun2010", 2),
entry("Sep2010", 1),
entry("May2010", 0),
entry("Oct2010", 1),
entry("Jul2010", 0),
entry("Aug2010", 0),
entry("Jan2010", 1)
);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMuuuu", Locale.ENGLISH);
Map<String, Integer> sorted = unsorted
.entrySet()
.stream()
.collect(Collectors.toMap(
e -> YearMonth.parse(e.getKey(), dtf),
e -> e.getValue(),
(v1, v2) -> v1,
TreeMap::new
)) // Returns TreeMap<YearMonth, Integer>
.entrySet()
.stream()
.collect(Collectors.toMap(
e -> dtf.format(e.getKey()),
e -> e.getValue(),
(v1, v2) -> v1,
LinkedHashMap::new
));
System.out.println(sorted);
}
}
通过documentation了解更多关于Collectors#toMap的信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。