Java 在合并排序列表中迭代
我的问题是: 假设当前年份的天数为1到365天。保险范围定义为一系列日期,包括保险开始日期和结束日期/期限日期。例:Java 在合并排序列表中迭代,java,algorithm,mergesort,Java,Algorithm,Mergesort,我的问题是: 假设当前年份的天数为1到365天。保险范围定义为一系列日期,包括保险开始日期和结束日期/期限日期。例:Cov(1,31)意味着该人在今年1月有保险 问题:给定一个人的一系列覆盖率数据,我们需要找到最长的连续覆盖率。覆盖范围可能存在重叠和/或差距。(给定的代码是Scala,我使用Java来解决) 我可能在处理这个问题时完全错了,但我想使用mergesort对原始数组进行排序,然后对其进行迭代,以打印最长的项。我的合并排序对我的列表进行排序。这就是我想要的。但是,我很难找到最长的连续覆
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吗?这是什么数据类型,因为它不允许我编译该行的原因。@bstapiesvar
“关键字”是在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 + ")";
}
}