首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for-循环中用if-语句计算min和max

在for-循环中用if-语句计算min和max
EN

Code Review用户
提问于 2013-11-19 00:13:28
回答 2查看 2.6K关注 0票数 7

此代码部分来自我的年度燃料使用类的主要方法。该计划预测我的年度燃料使用至少三个加油我的汽车。在这里,我计算的最大和最小的距离(这是英里旅行),MPG,和价格每加仑。我想做个全面的回顾。

代码语言:javascript
复制
//initialization of array of objects
AnnualFuelUse[] fillUps = {new AnnualFuelUse (1, 1, 6500, 6800, 9.70, 3.11),
                          new AnnualFuelUse (2, 10, 6800, 7052, 8.10, 3.08),
                          new AnnualFuelUse (3, 20, 7052, 7349, 9.20, 3.15)};

//calculate Min and Max for distance, MPG, and price per gallon
double minDist = 0, maxDist = 0;
double minMPG = 0.0, maxMPG = 0.0, minPrice = 0.0, maxPrice = 0.0;

Double dMin = Double.MAX_VALUE;
Double dMax = Double.MIN_VALUE;
Double mpgMin = Double.MAX_VALUE;
Double mpgMax = Double.MIN_VALUE;
Double priceMin = Double.MAX_VALUE;
Double priceMax = Double.MIN_VALUE;

for (int i = 0; i < fillUps.length; i++) {
    if (fillUps[i].getDist() < dMin){
        dMin = fillUps[i].getDist();
        minDist = dMin;
    }     
    if (fillUps[i].getDist() > dMax) {
        dMax = fillUps[i].getDist();
        maxDist = dMax;
    }
    if (fillUps[i].getMilesPerGallon() < mpgMin) {
        mpgMin = fillUps[i].getMilesPerGallon();
        minMPG = mpgMin;
    }    
    if (fillUps[i].getMilesPerGallon() > mpgMax) {
        mpgMax = fillUps[i].getMilesPerGallon();
        maxMPG = mpgMax;
    }             
    if (fillUps[i].getPrice() < priceMin) {
        priceMin = fillUps[i].getPrice();
        minPrice = priceMin;
    }          
    if (fillUps[i].getPrice() > priceMax) {
        priceMax = fillUps[i].getPrice();
        maxPrice = priceMax;
    }
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2013-11-19 01:12:19

您的每个if-语句都可以简化。

代码语言:javascript
复制
if (fillUps[i].getDist() > dMin){
    dMin = fillUps[i].getDist();
    minDist = dMin;
}

首先,因为您同时修改了两个变量,所以可以将它写在同一行上。

代码语言:javascript
复制
if (fillUps[i].getDist() > dMin){
    minDist = dMin = fillUps[i].getDist();
}

但是,这表明您可能有太多的变量,因为minDistdMin相同。我将保留原语类型double的变量,并去掉非原始变量。因为Double.MAX_VALUEDouble.MIN_VALUE是一个常规的double,所以我不认为需要Double类型。只需确保正确地初始化min/max变量(Double.MIN_VALUEDouble.MAX_VALUE)。

然后,您要做的是始终得到两个值的最小值,因此可以使用Math.min方法来简化。

代码语言:javascript
复制
minDist = Math.min(fillUps[i].getDist(), minDist);

因此,您的四行if语句段中的每一行都可以成为一行!

代码语言:javascript
复制
for (int i = 0; i < fillUps.length; i++) {
    minDist = Math.min(fillUps[i].getDist(), minDist);
    maxDist = Math.max(fillUps[i].getDist(), maxDist);
    minMPG = Math.min(fillUps[i].getMilesPerGallon(), minMPG);
    maxMPG = Math.max(fillUps[i].getMilesPerGallon(), maxMPG);
    minPrice = Math.min(fillUps[i].getPrice(), minPrice);
    maxPrice = Math.max(fillUps[i].getPrice(), maxPrice);
}
票数 4
EN

Code Review用户

发布于 2013-11-19 00:44:54

该代码违反了告诉我,别问

程序代码获取信息,然后作出决定。面向对象的代码告诉对象做一些事情。~Alec Sharp

在我们讨论这个问题之前,请考虑:

代码语言:javascript
复制
fillUps[i].getDist() > dMin

可以写:

代码语言:javascript
复制
fillUps[i].canTravel( dMin )

同样:

代码语言:javascript
复制
fillUps[i].getPrice() > priceMax

可以写:

代码语言:javascript
复制
fillUps[i].priceExceeds( priceMax );

重要的问题仍然没有答案:为什么代码要检查距离和价格?如果你想要做的就是确定一个给定的储气罐要花多少钱,那就写:

代码语言:javascript
复制
float maxDistance = fillUps[i].calculateDistance();

如果您想知道填充剩余油箱的价格,请写:

代码语言:javascript
复制
float price = fillUps[i].calculateFillPrice();

将使用变量的代码移到具有变量的类中。

您也可以比较对象,而不是内部变量。例如:

代码语言:javascript
复制
AnnualFuelUse fillUps[] // ...
AnnualFuelUse minPriceFillUp;

for (int i = 0; i < fillUps.length; i++) {
  if( fillUps[i].exceedsPrice( fillUps[i-1] ) ) {
    maxPriceFillUp = fillUps[i];
  }

  if( fillUps[i].exceedsDistance( fillUps[i-1] ) ) {
    maxDistanceFillUp = fillUps[i];
  }

  // ...
}

在循环结束时,将有包含所需信息的对象。使用这些对象,您可以要求它们执行特定的任务。然后使get访问器方法private

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/35647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档