我有对象的列表List<SingleDay>
,其中SingleDay
是
class SingleDay{
private Date date;
private String County;
// otherstuff
}
我希望将此列表转换为Map<Date, Map<String, SingleDay>>
。也就是说,我希望从Date到Counties的地图都回到原始对象。
例如:
02/12/2020 : { "Rockbridge": {SingleDayObject}}
如果从对象列表到地图,而不是从对象列表到嵌套地图,那么我什么都无法工作,也无法在线找到所有内容。
基本上,我希望能够快速查询与日期和县相对应的对象。
谢谢!
编辑:
import java.io.FileReader;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;
public class DataParser {
private List<SingleDay> data;
private String filename;
public DataParser(String filename) {
data = new ArrayList<>();
this.filename = filename;
}
public void parse() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");
try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
String line = br.readLine();
line = br.readLine(); // read and consume header line
while (line != null) {
String[] values = line.split(",");
LocalDate d = LocalDate.parse(values[0], formatter);
data.add(new SingleDay(d, values[2], values[3], Integer.parseInt(values[4]), Integer.parseInt(values[6])));
line = br.readLine();
}
br.close();
}
catch(Exception e) {
System.out.println(e);
}
// error here
Map<Date, Map<String, SingleDay>> result = data.stream().collect(Collectors.toMap(SingleDay::getDate,
sd -> list.stream().collect(Collectors.toMap(SingleDay::getCounty, e -> e))));
}
如下进行:
Map<LocalDate, Map<String, SingleDay>> result = list.stream()
.collect(Collectors.toMap(SingleDay::getDate, v -> Map.of(v.getCounty(), v)));
演示:
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class SingleDay {
private LocalDate date;
private String County;
public SingleDay(LocalDate date, String county) {
this.date = date;
County = county;
}
public LocalDate getDate() {
return date;
}
public String getCounty() {
return County;
}
@Override
public String toString() {
return "SingleDay [date=" + date + ", County=" + County + "]";
}
// otherstuff
}
public class Main {
public static void main(String[] args) {
List<SingleDay> list = List.of(new SingleDay(LocalDate.now(), "X"),
new SingleDay(LocalDate.now().plusDays(1), "Y"), new SingleDay(LocalDate.now().plusDays(2), "Z"));
Map<LocalDate, Map<String, SingleDay>> result = list.stream()
.collect(Collectors.toMap(SingleDay::getDate, v -> Map.of(v.getCounty(), v)));
// Display
result.forEach((k, v) -> System.out.println("Key: " + k + ", Value: " + v));
}
}
输出:
Key: 2020-05-27, Value: {Z=SingleDay [date=2020-05-27, County=Z]}
Key: 2020-05-26, Value: {Y=SingleDay [date=2020-05-26, County=Y]}
Key: 2020-05-25, Value: {X=SingleDay [date=2020-05-25, County=X]}
注意:我使用的LocalDate
不是过时的java.util.Date
。我强烈建议您使用java.time
API而不是break java.util.Date
。选中此项以了解更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句