【问题标题】:How to map a float to an enum without a long stack of if statements如何在没有大量 if 语句的情况下将浮点数映射到枚举
【发布时间】:2012-02-10 15:00:31
【问题描述】:

给定一个浮点数,如何将其映射到像这样的枚举

{失败、差​​、好、好、优秀、完美}

如果分区不均匀。

0.0-0.4 失败
0.4-0.6 很差
...
0.8-0.999.. 非常好
1.0 是完美的

浮点数是根据游戏中所有已玩关卡计算得出的评分值。它的范围为 0..1,包括 0..1。通常需要的分区不超过 10 个,但间距会在开发过程中进行调整。

我目前正在使用一堆 if..else 语句。这是正确的方法吗?好像有点脆。

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    使用结构数组 - 静态分配的或动态的 - 然后使用简单的例程来搜索它 - 如果它很小,就进行迭代,如果它很大,你可以进行二分搜索。

    您知道最小值 (0.0) 和最大值 (1.0),您只需要存储范围的上限和枚举值。例如:

    typedef enum {FAIL, POOR, OK, GOOD, EXCELLENT, PERFECT} Rating;
    
    typedef struct
    {
       float upperBound;
       Rating score;
    } RatingDivision;
    
    static RatingDivision Divisions[] =
    {
       { 0.4, FAIL },
       { 0.6, POOR },
       ...
       { 0.999, EXCELLENT },
       { 1.0, PERFECT }
    };
    

    现在sizeof(Divisions)/sizeof(RatingDivision) 将告诉您条目的数量(二进制搜索所需),或者只是迭代直到您要查找的值是<= Divisions[i].upperBound 返回Divisions[i].scoreupperBound 达到1.0不匹配并处理错误。

    【讨论】:

      【解决方案2】:

      您可以使用并行数组:使用阈值浮点值数组和相同大小的枚举值数组;那么您可以使用一个短循环,检查浮点数组中的每个值,并在超过阈值后返回枚举值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2022-11-29
        相关资源
        最近更新 更多