根据阈值限制从数组中删除项目?

时间:2018-05-03 06:39:11

标签: java arrays

我正在进行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美元的成本移除该房屋。

非常感谢你!

1 个答案:

答案 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基本上是一个动态大小的数组,可以让你的工作更轻松。