【问题标题】:How to calculate all MPG in a list of Fuel Entries from Realm Database如何从 Realm 数据库计算燃料条目列表中的所有 MPG
【发布时间】:2015-07-18 17:50:00
【问题描述】:

好的,我要做的就是这样。我有一个带有“FuelEntries”数组的“汽车”对象。每个 FuelEntry 都有 mileage、gallonsPumped 属性和“fillUp”的 Bool 值。

我在我的应用程序中成功计算了最新的燃油里程,并使用以下方法显示结果:

    - (float)calculateMPG:(Car*)car {
    RLMResults *fuelResults1 = [car.fuelEntries objectsWhere:@"fillUp = YES"];
    if (fuelResults1.count <= 1) {
        return 0.0;
    } else {
        NSUInteger __block firstEntry = 0;
        NSUInteger __block secondEntry = 0;
        float __block gallonsTotal = 0.0;

        RLMResults *fuelResults = [car.fuelEntries sortedResultsUsingProperty:@"date" ascending:NO];
        NSMutableArray *results = [NSMutableArray new];
        for (FuelEntry *entry in fuelResults) {
            [results addObject:entry];
        }

        [results enumerateObjectsUsingBlock:^(FuelEntry *obj, NSUInteger idx, BOOL *stop) {
            if (obj.fillUp == YES && firstEntry == 0) {
                firstEntry = obj.mileage;
                gallonsTotal += obj.gallons;
            } else if (obj.fillUp == NO && firstEntry == 0) {
                idx++;
            } else if (obj.fillUp == YES && firstEntry != 0) {
                secondEntry = obj.mileage;
                *stop = YES;
            } else {
                gallonsTotal += obj.gallons;
            }

        }];

        return (firstEntry - secondEntry) / gallonsTotal;
    }
}

但是,我被困在如何遍历整个数组并计算 所有 可能的 MPG 读数,以便我可以随着时间的推移创建报告。

我正在考虑创建一个名为 MPGEntry 的 RLMObject,但如果我可以在需要时计算它,我认为它会更简单。

这是我的“汽车”类标题:

#import <Realm/Realm.h>

#import "OilChange.h"
#import "FuelEntry.h"
#import "ServiceEntry.h"
#import "MonthlyMilesEntry.h"
#import "PhotoObject.h"
#import "MPGEntry.h"

RLM_ARRAY_TYPE(OilChange)
RLM_ARRAY_TYPE(FuelEntry)
RLM_ARRAY_TYPE(MonthlyMilesEntry)
RLM_ARRAY_TYPE(ServiceEntry)


@interface Car : RLMObject
@property NSString *uuid;
@property NSString *name;
@property NSString *make;
@property NSString *VIN;
@property NSInteger year;
//@property BOOL activeCar;
@property NSInteger currentMileage;
@property NSString *driverID;
@property NSInteger oilChangeMiles;
@property NSInteger nextOilChange;


@property RLMArray<PhotoObject> *carPhoto;
@property RLMArray<OilChange> *oilChanges;
@property RLMArray<FuelEntry> *fuelEntries;
@property RLMArray<ServiceEntry> *serviceEntries;
@property RLMArray<MonthlyMilesEntry> *monthlyMilesEntries;
@property RLMArray<MPGEntry> *mpgEntries;

+ (NSDictionary *)defaultPropertyValues;
+ (NSString *)primaryKey;

@end

这是我当前的“FuelEntry”标题:

#import <Realm/Realm.h>
#import "PhotoObject.h"

@interface FuelEntry : RLMObject

@property NSDate *date;
@property NSInteger mileage;
@property double price;
@property double gallons;
@property BOOL fillUp;
@property RLMArray<PhotoObject> *receipts;

+ (NSDictionary *)defaultPropertyValues;

@end

非常感谢任何帮助。

【问题讨论】:

    标签: objective-c algorithm realm


    【解决方案1】:

    据我所知,您的逻辑会抓取与汽车相关的所有燃料输入,然后使用该循环计算最近的 2 个加油事件以计算出最新的 MPG。

    既然你已经得到了所有的燃料条目,我不明白为什么不能遍历整个数组来计算以前的 MPG 结果。

    希望,这只是创建另一个数组对象来保存 MPG 结果的问题,然后每当您到达循环中同时具有“firstEntry”和“secondEntry”的点时,您就可以在那里执行计算,然后重置这两个条目。

    如果我在这里遗漏了什么,请告诉我!

    【讨论】:

    • 好吧,我实际上并没有计算第二次加满。我停在那里。对于我一直在使用的当前测试版本,我试图修改它以遍历迁移块中的所有代码一次,我不记得我做了什么,但我只是一直得到一个结果。我不知道如何将我在这里拥有的东西转换为将继续超过“最后一个”MPG 的东西,并继续前进,直到它通过创建所有可能的 MPG 条目的所有条目。我知道我要么将 secondEntry 重置为 firstEntry 并继续枚举,要么随时创建 mpg 条目。
    • 很公平。是的,在这种情况下,我同意 MPG 条目的想法。明确跟踪哪个燃料进入符合哪个加注事件最有可能使事情变得更容易一些。 :)
    • 感觉快到了,但我不知道。每次我尝试这样做时,我最终都会掉进一个兔子洞。知道如何将其变成可以迭代和存储 MPG 条目的东西吗?也许完全采取不同的方法?我需要修改数组,但我认为我不能修改正在枚举的数组。我需要在枚举它们之后删除条目,然后当我找到结果时,从剩下的开始。至少我是这么认为的……
    • 抱歉耽误了达雷尔!我不知道我是否可以帮助您完全重新构建解决方案,但我认为您已经走上了正确的道路。就像我之前说的那样,简单地计算 MPG 条目并将它们保存到 Realm 数据库而不是尝试追溯重新计算它们可能更容易。祝你好运! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多