Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在合并排序列表中迭代_Java_Algorithm_Mergesort - Fatal编程技术网

Java 在合并排序列表中迭代

Java 在合并排序列表中迭代,java,algorithm,mergesort,Java,Algorithm,Mergesort,我的问题是: 假设当前年份的天数为1到365天。保险范围定义为一系列日期,包括保险开始日期和结束日期/期限日期。例:Cov(1,31)意味着该人在今年1月有保险 问题:给定一个人的一系列覆盖率数据,我们需要找到最长的连续覆盖率。覆盖范围可能存在重叠和/或差距。(给定的代码是Scala,我使用Java来解决) 我可能在处理这个问题时完全错了,但我想使用mergesort对原始数组进行排序,然后对其进行迭代,以打印最长的项。我的合并排序对我的列表进行排序。这就是我想要的。但是,我很难找到最长的连续覆

我的问题是:

假设当前年份的天数为1到365天。保险范围定义为一系列日期,包括保险开始日期和结束日期/期限日期。例:
Cov(1,31)
意味着该人在今年1月有保险

问题:给定一个人的一系列覆盖率数据,我们需要找到最长的连续覆盖率。覆盖范围可能存在重叠和/或差距。(给定的代码是Scala,我使用Java来解决)

我可能在处理这个问题时完全错了,但我想使用mergesort对原始数组进行排序,然后对其进行迭代,以打印最长的项。我的合并排序对我的列表进行排序。这就是我想要的。但是,我很难找到最长的连续覆盖范围。它不会只是打印最后一个索引和第二到最后一个索引,所以我迷路了

公共类Cov{
私人int eff;
专用术语;
公共Cov(有效期、有效期){
this.eff=eff;
这个术语=术语;
}
公共静态无效合并(int[]覆盖率、int eff、int mid、int term){
//创建临时子阵列
int leftArray[]=新int[mid-eff+1];
int rightArray[]=新的int[term-mid];
//将子数组复制到临时数组中
for(int i=0;i如果(术语要查找最长的持续覆盖范围,请迭代列表并跟踪当前覆盖期,根据需要扩展/替换

var coverages = List.of(new Cov(1,20), new Cov(21,30), new Cov(15,25),
        new Cov(28,40), new Cov(50, 60), new Cov(61,200));

// Sort coverage periods by start value (eff)
//   (streaming into new list since original list is immutable)
coverages = coverages.stream().sorted(Comparator.comparingInt(Cov::getEff))
        .collect(Collectors.toList());

// Iterate coverage periods and find length of longest continuously covered period
int currEff = -1, currTerm = -1, maxLen = 0;
for (Cov cov : coverages) {
    if (cov.getEff() > currTerm + 1) { // Replace current coverage period if gap detected
        currEff = cov.getEff();
        currTerm = cov.getTerm();
    } else if (currTerm < cov.getTerm()) { // Extend current coverage period if needed
        currTerm = cov.getTerm();
    }
    // Update max if current coverage period is longer than any seen so far
    if (currTerm - currEff >= maxLen)
        maxLen = currTerm - currEff + 1;
}

System.out.println(maxLen); // prints: 151

为什么要使用自制的合并排序,而不仅仅是内置的or?老实说,我忘了Java有这些内置的排序类,直到你刚刚提到它。Welp。现在我觉得很傻。我只是无缘无故地做了所有这些。但我仍然被困在这个持续时间最长的部分中。
61200
a
开始和结束/学期日期
?谢谢@Andr非常感谢。问题,主方法中覆盖率的var应该是var吗?这是什么数据类型,因为它不允许我编译该行的原因。@bstapies
var
“关键字”是在Java 10中添加的。请参见---如果使用Java<10,请将
var
替换为
List
。只是想让它看起来尽可能接近您的Scala代码。啊,好的。谢谢。@Andreas我明白了。谢谢:在Java 9中添加了
List.of(…)
。我将其还原为var coverages = List.of(new Cov(1,20), new Cov(21,30), new Cov(15,25), new Cov(28,40), new Cov(50, 60), new Cov(61,200)); // Sort coverage periods by start value (eff) // (streaming into new list since original list is immutable) coverages = coverages.stream().sorted(Comparator.comparingInt(Cov::getEff)) .collect(Collectors.toList()); // Iterate coverage periods and find length of longest continuously covered period int currEff = -1, currTerm = -1, maxLen = 0; for (Cov cov : coverages) { if (cov.getEff() > currTerm + 1) { // Replace current coverage period if gap detected currEff = cov.getEff(); currTerm = cov.getTerm(); } else if (currTerm < cov.getTerm()) { // Extend current coverage period if needed currTerm = cov.getTerm(); } // Update max if current coverage period is longer than any seen so far if (currTerm - currEff >= maxLen) maxLen = currTerm - currEff + 1; } System.out.println(maxLen); // prints: 151
class Cov {
    private final int eff;
    private final int term;
    public Cov(int eff, int term) {
        this.eff = eff;
        this.term = term;
    }
    public int getEff() {
        return this.eff;
    }
    public int getTerm() {
        return this.term;
    }
    @Override
    public String toString() {
        return "Cov(" + this.eff + "," + this.term + ")";
    }
}