我正在进行Java
任务,我需要包含一个方法,该方法将从一系列Homes(一种由分配脚本创建的对象)中删除所有每月费用高于输入阈值。我的代码适用于某些情况,但有些房屋在某些情况下会被删除,而在其他情况下则不会。
public int remove(double cost) {
int count = 0;
int index;
do {
index = 0;
while ((this.homeList[index].costPerMonth() < cost)
&& (index < this.numHomes)) {
index++;
}
if (index < this.numHomes) {
for (int i = index; i <= this.numHomes - 1; i++) {
//If the cost is higher than the threshold, that
//home is removed and all other homes are slid up
//one position in the list
if (index < (this.numHomes - 1)) {
this.homeList[i] = this.homeList[i + 1];
}
count = count + 1;
this.numHomes = this.numHomes - 1;
}
}
//Do while loop ends when all the homes in the list
//have costs lower than the threshold
//When index == numHomes, it has cycled through the whole
//list without stopping for a cost too high
} while (index != this.numHomes);
//Return the number of homes removed
return count;
}
homeList
是我的家庭数组,costPerMonth()
是用Home
类编写的方法,而numHomes
是我用来跟踪多少个的实例变量在任何给定的点上,家庭都在阵中。
此代码给出了正确的答案,但是一个特定的案例一直给我带来问题:
对于我已经定义了每月费用为1234.56美元且我将阈值设置为1980的房屋的测试,如果代码是列表中唯一的房屋(好),代码将不会删除该房屋。但是如果我在向homeList
添加多个房屋之后运行代码,并且我运行具有相同阈值1980的代码,则会以每月1234.56美元的成本移除该房屋。
非常感谢你!
答案 0 :(得分:0)
这是一个奇怪的编写代码;)当您调用方法或访问当前为null的对象的属性时,会发生空指针异常。在您的代码中,可能是对.costPerMonth()
的调用。你在null元素上的某个地方做。
这个循环:
while ((this.homeList[index].costPerMonth() < cost)
&& (index < this.numHomes)) {
index++;
}
查找具有costPerMonth的住宅数量
if (index < this.numHomes) { // that will always be true seeing how index grows in the loop above
为什么不创建第二个数组并将项目移动到那里?类似的东西:
Home[] resultArray=new Home[this.numHomes]
int resultArrayIndex=0;
for (int i = index; i <= this.numHomes - 1; i++) {
if(this.homeList[index].costPerMonth() < cost)
resultArray[resultArrayIndex++]=this.homeList[index];
它可能会导致更多的内存使用,但它会让您更容易理解代码。如果那是为数组的赋值。无论如何你都可以这样做,你可以查看java collections api。例如,ArrayList基本上是一个动态大小的数组,可以让你的工作更轻松。