哪种方法是使用scala分析间隔中数字的最佳方法?

时间:2018-09-13 06:00:28

标签: scala

我想分析间隔中的数字,

Home/HomeRequest/?cid=11&culture=no

间隔

samle data,x=5

结果为0。

我想用一种简单的方法来解决这个问题,我不想在scala中写... else。

5 个答案:

答案 0 :(得分:2)

与if-guards匹配的模式:

// setup an LRU cache (with eviction policy)...
const PROFILE_CACHE = LRU({ max: 50, maxAge: 1000 * 60 })

// receives "lots" of async requests from a client...
socket.on('getUserProfileRequest', userId => {
  PROFILE_CACHE.get(userId, () => getUserProfile(userId))
    .then(profile => socket.emit('getUserProfileResponse', profile))
})

// calls upstream server, does async/expensive/long running work, returns a Promise...
function getUserProfile(userId) { /* ... */ }

答案 1 :(得分:2)

如果值的范围不受限制,则可以使用整数除以10:

x / 10 // 5/10 = 0   17/10 = 1   21/10 = 2   1234/10 = 123

整数除法是仅保留整数部分(不保留小数部分)的除法:

5  / 10 = 0 //  5 = 0*10 + 0.5*10
13 / 10 = 1 // 13 = 1*10 + 0.3*10

更具体地说,随着间隔从10*n+1开始,您可以使用:

(x-1) / 10 // 1=>0, 10=>0, 11=>1

答案 2 :(得分:0)

不太优雅,但可以提供帮助:

   x match {
      case _ if  0 to 10 contains x => 0
      case _ if 10 to 20 contains x => 2
      case _  => 3
   }

答案 3 :(得分:0)

val q = 20

val result = q match {
  case _ if 0 to 10 contains q => 0
  case _ if 10 to 20 contains q => 1
  case _ if 20 to 30 contains q => 3
}

'直到'不会包含该范围内的最后一个数字,因此请使用'to'

答案 4 :(得分:0)

用间隔和这些间隔的代码值形成两个向量可能会有所帮助:(throws NoSuchElementException if the value supplied in not in any of the intervals provided.)。我个人比较喜欢这样做,因为添加更多数据(这些间隔和代码值都代替这些间隔,而不是添加)会很灵活如果要针对大量间隔以及这些间隔的对应代码值测试提供的值,则在所有间隔中的代码中添加一长串的case语句列表。对于可变间隔而不是恒定范围,它足够灵活。)

val v1 = Vector((0,10),(10,20),(20,30)); val v2 = Vector(0,1,2)
def getCode(x:Int,ivals:Vector[(Int,Int)],codes:Vector[Int]) ={
 v1.zip(v2).find(t=>t._1._1<x && t._1._2>=x).get._2  }

用法:

scala> val v1 = Vector((0,10),(10,20),(20,30))
v1: scala.collection.immutable.Vector[(Int, Int)] = Vector((0,10), (10,20), (20,30))

scala> val v2 = Vector(0,1,2)
v2: scala.collection.immutable.Vector[Int] = Vector(0, 1, 2)

scala> getCode(5,v1,v2)
res14: Int = 0

scala> getCode(23,v1,v2)
res15: Int = 2