【问题标题】:Writing function findEpidemics编写函数 findEpidemics
【发布时间】:2021-12-04 07:39:34
【问题描述】:

我需要创建一个函数 public Collection findEpidemics(List diagnostics, int k, int n) 确定疾病是否为流行病,并返回流行病的列表。如果一种疾病在连续 k 天内发生 n 次以上,我们就说它是流行病。 Diagnosis 类是 public Diagnosis(Disease disease, int day),具有 getDisease() 和 getDay() 函数。

诊断列表如下所示:

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 集合,因此它可能看起来像这样:{{cholera, 0}=2, {cholera, 1}=1 , {登革热, 2}=2, {霍乱, 6}=1}

 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++){
          ???
    }
  }

}

我有点卡在检查一种疾病是否是一种流行病,所以我卡在如何循环哈希图并检查某种疾病的发生是否超过 n 连续 k天。

【问题讨论】:

    标签: java algorithm hashmap


    【解决方案1】:

    获得映射后,您可以使用条目列表上方的滑动窗口继续检查流行病。

        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;
        }
    

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

    【讨论】:

    • 谢谢,如果您觉得答案有用,请点赞。
    猜你喜欢
    • 2018-06-20
    • 2017-02-02
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2011-12-27
    相关资源
    最近更新 更多