import java.util.*;
import java.util.stream.*;
public class FileRecordExample {
public static void main(String[] args) {
// 範例資料
List<FileRecord> records = Arrays.asList(
new FileRecord("2025", "07", "Taipei"),
new FileRecord("2025", "07", "Kaohsiung"),
new FileRecord("2025", "06", "Taichung"),
new FileRecord("2025", "07", "Tainan"),
new FileRecord("2025", "06", "Taichung")
);
// Step 1: grouping into Map<yyyymm, List<location>>
Map<String, List<String>> grouped = records.stream()
.collect(Collectors.groupingBy(
r -> r.getYyyy() + r.getMm(),
Collectors.mapping(FileRecord::getLocation, Collectors.toList())
));
// Step 2: sort by key (yyyymm) descending into a LinkedHashMap
LinkedHashMap<String, List<String>> sortedDesc = grouped.entrySet().stream()
.sorted(Map.Entry.<String,List<String>>comparingByKey(Comparator.reverseOrder()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(u, v) -> u,
LinkedHashMap::new
));
// 輸出結果
sortedDesc.forEach((yyyymm, locs) ->
System.out.println(yyyymm + " -> " + locs)
);
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKCgoKcHVibGljIGNsYXNzIEZpbGVSZWNvcmRFeGFtcGxlIHsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgIC8vIOevhOS+i+izh+aWmQoKICAgICAgICBMaXN0PEZpbGVSZWNvcmQ+IHJlY29yZHMgPSBBcnJheXMuYXNMaXN0KAoKICAgICAgICAgICAgbmV3IEZpbGVSZWNvcmQoIjIwMjUiLCAiMDciLCAiVGFpcGVpIiksCgogICAgICAgICAgICBuZXcgRmlsZVJlY29yZCgiMjAyNSIsICIwNyIsICJLYW9oc2l1bmciKSwKCiAgICAgICAgICAgIG5ldyBGaWxlUmVjb3JkKCIyMDI1IiwgIjA2IiwgIlRhaWNodW5nIiksCgogICAgICAgICAgICBuZXcgRmlsZVJlY29yZCgiMjAyNSIsICIwNyIsICJUYWluYW4iKSwKCiAgICAgICAgICAgIG5ldyBGaWxlUmVjb3JkKCIyMDI1IiwgIjA2IiwgIlRhaWNodW5nIikKCiAgICAgICAgKTsKCgoKICAgICAgICAvLyBTdGVwIDE6IGdyb3VwaW5nIGludG8gTWFwPHl5eXltbSwgTGlzdDxsb2NhdGlvbj4+CgogICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ3JvdXBlZCA9IHJlY29yZHMuc3RyZWFtKCkKCiAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeSgKCiAgICAgICAgICAgICAgICByIC0+IHIuZ2V0WXl5eSgpICsgci5nZXRNbSgpLAoKICAgICAgICAgICAgICAgIENvbGxlY3RvcnMubWFwcGluZyhGaWxlUmVjb3JkOjpnZXRMb2NhdGlvbiwgQ29sbGVjdG9ycy50b0xpc3QoKSkKCiAgICAgICAgICAgICkpOwoKCgogICAgICAgIC8vIFN0ZXAgMjogc29ydCBieSBrZXkgKHl5eXltbSkgZGVzY2VuZGluZyBpbnRvIGEgTGlua2VkSGFzaE1hcAoKICAgICAgICBMaW5rZWRIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBzb3J0ZWREZXNjID0gZ3JvdXBlZC5lbnRyeVNldCgpLnN0cmVhbSgpCgogICAgICAgICAgICAuc29ydGVkKE1hcC5FbnRyeS48U3RyaW5nLExpc3Q8U3RyaW5nPj5jb21wYXJpbmdCeUtleShDb21wYXJhdG9yLnJldmVyc2VPcmRlcigpKSkKCiAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoCgogICAgICAgICAgICAgICAgTWFwLkVudHJ5OjpnZXRLZXksCgogICAgICAgICAgICAgICAgTWFwLkVudHJ5OjpnZXRWYWx1ZSwKCiAgICAgICAgICAgICAgICAodSwgdikgLT4gdSwKCiAgICAgICAgICAgICAgICBMaW5rZWRIYXNoTWFwOjpuZXcKCiAgICAgICAgICAgICkpOwoKCgogICAgICAgIC8vIOi8uOWHuue1kOaenAoKICAgICAgICBzb3J0ZWREZXNjLmZvckVhY2goKHl5eXltbSwgbG9jcykgLT4KCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih5eXl5bW0gKyAiIC0+ICIgKyBsb2NzKQoKICAgICAgICApOwoKICAgIH0KCn0K