一个范围取值的问题

smh821025 发布于 2015/05/24 05:54
阅读 291
收藏 1
有一个需求请大家帮忙看一下,有没有最优的办法,考虑性能和代码简洁性。 我有一个规则表,里面存放的是每个等级的值,比如一级是5,二级是10,三级是15,四级是20,后面以此类推,现在我要传递一个参数,当我把这个参数传入后,需要很快的得到对应的等级,比如我传入8,那么给我返回的是一级,如果传入16,那么给我返回的是三级,我知道这个可以用类似于switch或数据库中的范围来判断并获得,但是等级会有很多,而且会有多个等级规则,也就是说,多个任务的等级,每个任务的等级都是不一样的,请高手给点建议有没有最好的办法解决,谢谢
加载中
0
shijacky
shijacky


def get_level(val):

    #l为一个按 o.val 升序的列表

    for o in l:

        if val < o.val:

            return o.level

    return default_level 

0
smh821025
smh821025

引用来自“shijacky”的评论


def get_level(val):

    #l为一个按 o.val 升序的列表

    for o in l:

        if val < o.val:

            return o.level

    return default_level 

我可以用Java或Mysql的Procedure来实现,你这个我大概看懂了

如果这样,我仍然要将所有的等级列表中每个键值存入一个Map里面,我关注的就是前面这个操作,如果我的等级列表会很大的话,我还是会需要去做很多的事情。

后面的for循环倒是可以借鉴,因为如果取到了符合的值,后面就不需要再去进行比对了,即for循环break。

另外感谢你的回复

smh821025
smh821025
回复 @shijacky : ok,我可以借鉴下,谢谢
shijacky
shijacky
等级列表初始化完一次就可以了,而且这个列表一般是读表,而不是写死在你的代码里面,做成配置,列表大的话,可以这么说,少于10W行,性能都不是问题
0
foy
foy
把每个等级的临界值放入升序数组M[i],i取1到你等级的上限,那么你这里就相当于在数组中查找传入的在M中的相对位置,直接二分查找就行了;另外就是可以考虑直接打表,用S[i]存算好的等级,其中i代表分,算算内存应该也用不了多少
0
vvtf
vvtf
select level, val from _table where val <=#{val} order by val desc limit 0,1
0
Cobbage
Cobbage
看了你这我觉得只有 /5 得到商了 级别
0
小新1
小新1
我觉得等级规则存在数据库里还是比较好的,写个函数来计算等级,java可以访问数据库的这个函数来获等级值,就不需要Map了。
0
中山野鬼
中山野鬼
查表,带排序,这个没什么难度。哈。
0
smh821025
smh821025

引用来自“中山野鬼”的评论

查表,带排序,这个没什么难度。哈。
我的问题不是难度的问题,而是希望从代码上去做到简洁性和解决系统的性能问题。
0
中山野鬼
中山野鬼

引用来自“中山野鬼”的评论

查表,带排序,这个没什么难度。哈。

引用来自“smh821025”的评论

我的问题不是难度的问题,而是希望从代码上去做到简洁性和解决系统的性能问题。
对带排序的查表方式,本身就是可以完成你上面的两个要求啊。代码简洁,系统高效。再说了,又不是搞c,搞汇编,啥高效都是假的。。哈。差不多就行了。
0
fieldinrain
fieldinrain

简单的话数据存sqlite,一条sql就能知道结果,数据和程序分离,维护起来也方便,要自己排序的话二分法查找也很方便

返回顶部
顶部