代码之家  ›  专栏  ›  技术社区  ›  baptiste

如何在C_中循环二维网格决策树?

  •  3
  • baptiste  · 技术社区  · 16 年前

    我有一个对象列表我必须基于两个条件设置属性二维网格如下所示:

    Property 2\Property 1   B<80        80<B<100       100<B<120           B>120
    A < 100                 None          Red           Orange            Orange
    100 < A < 120           None          Red           Orange             Green
    120 < A < 140           None          Red           Green              Green
    140 < A                 None         Orange         Green              Green
    

    有没有好的方法循环属性1和属性2来动态设置对象属性?将来我们可能会增加一些标准,我想做多个ifs并不是一个好的解决方案。我试图避免冗余代码。

    谢谢

    3 回复  |  直到 16 年前
        1
  •  0
  •   Ali Lown    16 年前

    如果我们能把a和b的两个条件转换成一个0-3的系统:
    如果a<100->ascale=0
    否则,如果a<120->ascale=1
    等。 对于B:
    如果b<80->b刻度=0
    否则,如果b<100->b刻度=1
    等。

    然后我们可以使用二维数组查找正确的输出响应:
    out=arrayname[ascale][bscale];

    但我不认为这比简单的硬编码节省了什么,如果只有一些额外的可能性,我认为硬编码是最好的解决方案。

        2
  •  2
  •   Godeke    16 年前

    如果您怀疑情况会频繁变化,我建议您使用数组查找。最好是从数据库或外部文件加载数据(以简化配置),但这里我对数组进行了硬编码:

            int[] alimits = new int[] { 100, 120, 140, int.MaxValue };
            int[] blimits = new int[] { 80, 100, 120, int.MaxValue };
            int aval = 125;
            int bval = 110;
    
            int aindex = 0;
            for (int i = 0; i < alimits.Count(); i++)
                if (aval < alimits[i])
                    aindex = i;
    
            int bindex = 0;
            for (int i = 0; i < blimits.Count(); i++)
                if (bval < blimits[i])
                    bindex = i;
    
            string[,] values = new string[,] {
                {"None", "Red", "Orange", "Orange"}, 
                {"None", "Red", "Orange", "Green"},
                {"None", "Red", "Green", "Green"},
                {"None", "Orange", "Green", "Green"}};
    

    这是未经测试的,但应该给你一个基本的想法。你得到的结果是 values[aindex, bindex] .

        3
  •  0
  •   Tigran    16 年前

    类抽象设置程序{void setobjectproperty();}

    类setterlessthen100:abstractsetter{/*实现a<100 case*/}的代码

    实现setter对象的列表,该列表针对每个可用的情况对该对象进行操作。 将它们全部添加到AbstractSetters集合中,对其进行迭代并调用setProperty()抽象方法(每个具体对象上都有重载)。 在将来,如果有其他条件要添加,那么实现新的setter并将其添加到abstractsetters集合就足够了。

    对不起,我没有足够的时间写所有的代码,希望它是清楚的。 祝你好运。