我目前正在使用Firestore,并且文档中包含以下数据:
String:phonenumb;数组:第1章[值]
我设法通过以下代码将它们放入外部和内部HashMap中:
CollectionReference chemistry = db.collection("RESULTS").document("Summary").collection("ChemistryVII");
chemistry
.whereEqualTo("school", "Test School")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (DocumentSnapshot document : task.getResult()) {
Map<String, Object> map = document.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getKey().contains("chapter")) {
if (outer.isEmpty() || !outer.containsKey(map.get("phonenumb"))) {
Map<String, Object> inner = new HashMap<>();
inner.put(entry.getKey(), entry.getValue());
String phonenumb = map.get("phonenumb").toString();
outer.put(phonenumb, inner);
} else {
Map<String, Object> inner = new HashMap<>();
inner.put(entry.getKey(), entry.getValue());
String phonenumb = map.get("phonenumb").toString();
outer.put(phonenumb, inner);
}
doSumm();
Toast("Document " + outer.values());
}
}
}
}
});
我现在希望将内部HashMap的值与doSumm()求和,但遇到了问题。
我对doSumm的尝试如下。
private void doSumm() {
int counter = outer.size();
List<Long> chaptersum = new ArrayList<>();
Toast("Outer Size "+ outer);
// Map<String, Map<String, Object>> chapterwise = new HashMap<>();
//Toast("Map Values " + ((Map) outer.get("5100351003")));
for (Map.Entry<String, Map<String, Object>> entry : outer.entrySet()) {
Map<String, Object> inner = entry.getValue();
int count = inner.size();
long summ = inner.values().stream().mapToLong(Long::longValue).sum();
}
}
我在Long :: longValue时遇到错误;另外,我不确定这是否是对嵌套哈希表中的值求和的最佳方法。
我在下一个活动中需要独立的值,它将分别显示它们。
提前感谢您的帮助。
您错过的是严格绑定用于内部和外部Map的数据类型。
您仍然可以摆脱:
long sum = inner.values().stream().filter(l -> l instanceof Long).mapToLong(l -> (Long) l).sum();
但是在这种情况下,适当的解决方法是在保留数据时引用适当的类型,例如Map<String, Long> innerMap
。