【发布时间】:2015-07-28 02:14:37
【问题描述】:
我有表单数据条目列表,每个DataEntry 包含Map<String, Object> 类型的数据字段。字符串键是动态字段名称(调查问题),值是针对该特定问题回答的选项。
在列表之外,我如何才能获得每个字段名称(问题)的唯一答案的计数,我假设是这样的? Map<String, LinkedTreeMap<String, Integer>,其中外层映射键为字段XXXX,其值映射键(字符串)为唯一答案,键整数为该答案的计数
出于测试目的,它们从数据库中以字符串形式出现,我将其映射到 DTO,其中映射器映射到正确的 json 映射:
DataEntry entry1 = new DataEntry();
entry1.setData("{field9294: '4', field9296: '3', field9319: '5', field9321: '5', field9323: '3', field9325: '3', field9327: '5', field9329: '7'}");
DataEntry entry2 = new DataEntry();
entry2.setData("{field9294: '3', field9296: '2', field9319: '3', field9321: '3', field9323: '5', field9325: '2', field9327: '4', field9329: '4'}");
DataEntry entry3 = new DataEntry();
entry3.setData("{field9294: '5', field9296: '5', field9319: '4', field9321: '4', field9323: '3', field9325: '3', field9327: '4', field9329: '8'}");
List<DataEntry> dataEntries = Arrays.asList(entry1, entry2, entry3);
List<FormDataDTO> dtos = dataEntries.stream().map(mapper::dataEntryToDto).collect(Collectors.toList());
所以 dtos 列表如下所示:
最终目标
让我们取第一个字段 field9294,在 3 个数据条目中给出了 3 个唯一答案:4、3、5。这里的计数都应该是 1。 现在 field9327 有答案 5、4、4。这里我们数 5 一次,4 两次。
一般的想法是分别绘制每个问题的数据,以便我可以绘制图表并将结果装饰为例如百分比。
正如我所见,获得Map<String, LinkedTreeMap<String, Integer> 就足以实现这一目标,但是有没有使用花哨的 lambda 技巧的有效方法,因为我自己还无法弄清楚。对于结果,我希望是这样的:
Map
key: "field9294"
values: "4" -> 1
"3" -> 1
"5" -> 1
key: "field9327"
values: "5" -> 1
"4" -> 2
等等。
提前致谢!
编辑: 通过,感谢您的解决方案!
assertEquals("[3=1, 4=1, 5=1]", answerCountsByField.get("field9294").entrySet().toString());
assertEquals("[2=1, 3=1, 5=1]", answerCountsByField.get("field9296").entrySet().toString());
assertEquals("[3=1, 4=1, 5=1]", answerCountsByField.get("field9319").entrySet().toString());
assertEquals("[3=1, 4=1, 5=1]", answerCountsByField.get("field9321").entrySet().toString());
assertEquals("[3=2, 5=1]", answerCountsByField.get("field9323").entrySet().toString());
assertEquals("[2=1, 3=2]", answerCountsByField.get("field9325").entrySet().toString());
assertEquals("[4=2, 5=1]", answerCountsByField.get("field9327").entrySet().toString());
assertEquals("[4=1, 7=1, 8=1]", answerCountsByField.get("field9329").entrySet().toString());
编辑2: 也在寻找这种结构的解决方案。对于结果,我只关心真正的答案,因为此结构映射到复选框列表,所以对于绘图来说 false 是多余的
{"field6696":{"1":true,"2":true},"field7994":{"1":true,"2":false,"3":false,"4":true}}
{"field6696":{"1":false,"2":true},"field7994":{"1":false,"2":true,"3":true}}
{"field6696":{"1":false,"2":true},"field7994":{"1":false,"2":true,"3":false,"4":true}}
{"field6696":{"1":false,"2":true,"3":true},"field7994":{"1":true,"2":true,"3":false}}
{"field6696":{"1":false,"2":true},"field7994":{"1":true,"2":true,"3":true,"4":true}}
【问题讨论】:
-
您可能正在这里寻找减少操作或自定义收集器
-
我尝试了许多不同的方法,但缺乏所有功能的知识,无法找到合适的解决方案。我可能会感谢一些示例代码的帮助。