首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入函数findEpidemics

写入函数findEpidemics
EN

Stack Overflow用户
提问于 2021-10-16 13:12:15
回答 1查看 48关注 0票数 1

我需要一个函数公共集合findEpidemics(列表诊断,int k,int n)来确定疾病是否是流行病,并返回流行病的列表。如果疾病在连续的k天内发生超过n次,我们就说它是流行病。诊断类是公共诊断(疾病,int日),并具有函数getDisease()和getDay()。

诊断列表如下所示:

代码语言:javascript
运行
复制
Disease cholera = new Disease("cholera");
Disease dengue = new Disease("dengue");
List<Diagnosis> diagnoses = Arrays.asList(
new Diagnosis(cholera, 0), // registered cholera on day 0
new Diagnosis(cholera, 0),
new Diagnosis(cholera, 1),
new Diagnosis(dengue, 2),
new Diagnosis(dengue, 2),
// we have a gap here 
new Diagnosis(cholera, 6),

因此,我所做的就是制作一个hashmap集合,其中包含每天发生的所有疾病,例如:{霍乱,0}=2,{霍乱,1}=1,{登革热,2}=2,{霍乱,6}=1} }

代码语言:javascript
运行
复制
 public Collection<String> findEpidemics(List<Diagnosis> diagnoses, int k, int n) {
    
     // first we count occurrences 
     Map<DiagnosisMetric, Long> collect = diagnoses.stream().
            collect(Collectors.groupingBy(DiagnosisMetric::new, counting()));
    
   // check for epidemic 
   for(int i=0; i<collect.size(); i++){
     for(int j=0; j<k; j++){
          ???
    }
  }

}

我被困在检查疾病是否是一种流行病,所以我被困在如何循环的hashmap和检查某一疾病的发生是否超过n个连续的k天。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-16 14:18:58

在得到映射之后,可以使用滑动窗口对条目列表继续检查大流行。

代码语言:javascript
运行
复制
    public static void findEpidemics(List<Diagnosis> diagnoses, int k, int n) {
        Map<DiagnosisMetric, Long> collect = diagnoses.stream().collect(Collectors.groupingBy(DiagnosisMetric::new, counting()));
        Map<String, List<Map.Entry<DiagnosisMetric, Long>>> diseaseByName = collect.entrySet().stream().collect(Collectors.groupingBy(diagnosisMetricLongEntry -> diagnosisMetricLongEntry.getKey().getDiagnosis().getDisease().getName()));
        List<String> pandemics = diseaseByName.entrySet().stream().collect(Collectors.partitioningBy(e -> isPandemic(e, n, k))).getOrDefault(true, Collections.emptyList()).stream().map(m -> m.getKey()).collect(Collectors.toList());
        System.out.println(pandemics);
    }

    public static boolean isPandemic(Map.Entry<String, List<Map.Entry<DiagnosisMetric, Long>>> e, int n, int k) {
        List<Map.Entry<DiagnosisMetric, Long>> collect = e.getValue().stream().sorted(Comparator.comparingInt(o -> o.getKey().getDiagnosis().getDay())).collect(Collectors.toList());
        int s = collect.size();
        Long sum = 0L;
        if(s < k) {
            return false;
        }
        Queue<Long> q = new ArrayDeque<>();
        for(int i = 0; i < k; i++) {
            Long value = collect.get(i).getValue();
            q.add(value);
            sum += value;
            if(sum > n) {
                return true;
            }
        }
        for(int j = k; j < s; j++) {
            Long value = collect.get(j).getValue();
            Long lastValue = q.poll();
            sum = sum - lastValue;
            q.add(value);
            sum += value;
            if(sum > n) {
                return true;
            }
        }
        return false;
    }

实现是相当初级的,但是您可以使用滑动窗口技术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69595915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档