如何在hashMap Firestore中求和嵌套值

问题描述 投票:2回答:1

我目前正在使用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时遇到错误;另外,我不确定这是否是对嵌套哈希表中的值求和的最佳方法。

我在下一个活动中需要独立的值,它将分别显示它们。

提前感谢您的帮助。

java android google-cloud-firestore hashmap java-stream
1个回答
0
投票

您错过的是严格绑定用于内部和外部Map的数据类型。

您仍然可以摆脱:

long sum = inner.values().stream().filter(l -> l instanceof Long).mapToLong(l -> (Long) l).sum();

但是在这种情况下,适当的解决方法是在保留数据时引用适当的类型,例如Map<String, Long> innerMap

© www.soinside.com 2019 - 2024. All rights reserved.