在地图列表中查找大于*的值

安德烈·皇后

我当前的系统是一个映射的String,List [Int],该String是键值,“ Sk1”,“ Sk2”等,而int是一个0-9的数字列表。

这是我当前查找所有列表的方法,如何编辑此方法以仅查找大于所选“ SK *”的所有“ Sk *”。列表的值是尾部的最后一个元素,我已经找到了它的功能。这是handleFive选项菜单。为了澄清,我需要找到最后一个元素(已经具有该功能),然后仅显示大于所选库存的库存。

菜单选项的处理程序

  def handleFive(): Boolean = {
    mnuShowSingleDataStock(currentStockLevel)
    true
  }

  def handleSeven(): Boolean = {
    mnuShowPointsForStock(allStockLevel)
    true
  }

调用用户并与用户交互的功能

// Returns a single result, not a list
  def mnuShowSingleDataStock(f: (String) => (String,Int)) = {
    print("Stock > ")
    val data = f(readLine)
    println(s"${data._1}: ${data._2}")
  }

//Returns a list value
  def mnuShowPointsForStock(f: (String) => (String,List[Int])) = {
    print("Stock > ")
    val data = f(readLine)
    println(s"${data._1}: ${data._2}")
  }

不确定如何编辑它,当前它显示列表中的所有值,我只想返回大于所选值的值

  //Show last element in the list, most current
  def currentStockLevel (stock: String): (String, Int) = {
    (stock, mapdata.get (stock).map(findLast(_)).getOrElse(0))
  }

//Unsure how to change this to only return values greater than the selected one, not everything
  def currentStockLevel (stock: String): (String, List[Int]) = {
    (stock, mapdata.get (stock).map(findLast(_)).getOrElse(0))
  }

我当前的映射列表-这是MAPDATA

val mapdata = Map(
    "SK1" -> List(9, 7, 2, 0, 7, 3, 7, 9, 1, 2, 8, 1, 9, 6, 5, 3, 2, 2, 7, 2, 8, 5, 4, 5, 1, 6, 5, 2, 4, 1),
    "SK2" -> List(0, 7, 6, 3, 3, 3, 1, 6, 9, 2, 9, 7, 8, 7, 3, 6, 3, 5, 5, 2, 9, 7, 3, 4, 6, 3, 4, 3, 4, 1),
    "SK3" -> List(8, 7, 1, 8, 0, 5, 8, 3, 5, 9, 7, 5, 4, 7, 9, 8, 1, 4, 6, 5, 6, 6, 3, 6, 8, 8, 7, 4, 0, 6),
    "SK4" -> List(2, 9, 5, 7, 0, 8, 6, 6, 7, 9, 0, 1, 3, 1, 6, 0, 0, 1, 3, 8, 5, 4, 0, 9, 7, 1, 4, 5, 2, 8),
    "SK5" -> List(2, 6, 8, 0, 3, 5, 5, 2, 5, 9, 4, 5, 3, 5, 7, 8, 8, 2, 5, 9, 3, 8, 6, 7, 8, 7, 4, 1, 2, 3),
    "SK6" -> List(2, 7, 5, 9, 1, 9, 8, 4, 1, 7, 3, 7, 0, 8, 4, 5, 9, 2, 4, 4, 8, 7, 9, 2, 2, 7, 9, 1, 6, 9),
    "SK7" -> List(6, 9, 5, 0, 0, 0, 0, 5, 8, 3, 8, 7, 1, 9, 6, 1, 5, 3, 4, 7, 9, 5, 5, 9, 1, 4, 4, 0, 2, 0),
    "SK8" -> List(2, 8, 8, 3, 1, 1, 0, 8, 5, 9, 0, 3, 1, 6, 8, 7, 9, 6, 7, 7, 0, 9, 5, 2, 5, 0, 2, 1, 8, 6),
    "SK9" -> List(7, 1, 8, 8, 4, 4, 2, 2, 7, 4, 0, 6, 9, 5, 5, 4, 9, 1, 8, 6, 3, 4, 8, 2, 7, 9, 7, 2, 6, 6)
  )
西里尔·科珀(Cyrille Corpet)

Map[String, List[Int]]类型具有一种filterKeys(f: String => Boolean)方法,以便仅保留满足给定谓词的键。

一个可能的解决方案是

// get int value from stock if of the form "SK<int>"
def stockInt(stock: String): Option[Int] = 
  Try(stock.drop(2).toInt).filter(_ => stock.startsWith("SK")).toOption

// we keep the keys in the return, so that you do not get unordered results
// (order is not assured by Map)
def currentStockLevel(stock: String): (String, Map[String, Int]) = {
  val maybeN = stockInt(stock)
  def isGreater(other: String) = (for {
    o <- stockInt(other)
    n <- maybeN
  } yield o > n).getOrElse(true) // if any key is not in the form of SK*, assume it is greater than the original stock

  (
    stock, 
    mapdata.filterKeys(isGreater(_)).mapValues(findLast(_))
  )
}

如果您确定只有“ SK”键,则另一种可能的方法是使用SortedMap,它使用aSortedSet作为其键,以便确保按需要将键值对进行排序。

在这种情况下,解决方案是

//put all values in mapdata in a SortedMap
val sortedMap = SortedMap[String, List[Int]]() ++ mapdata

def currentStockLevel(stock: String): (String, List[Int]) = {
  (
    stock, 
    sortedMap.dropWhile(_ <= stock).toList.map(_._2).map(findLast(_))
  )
}

编辑(在对预期收益的评论之后):

如果我很了解您要执行的操作,那么您希望过滤值而不是键。这不是问题,Map也有一种filter(p: ((K, V)) => Boolean): Map[K, V]方法可以做到这一点:

def currentHigherStockLevel(stock: String): Map[String, Int] = {
  val current = datamap.get(stock).map(findLast).getOrElse(0) // if stock is not in the keySet, we keep all keys, by keeping those greater than 0.
  datamap.mapValues(findLast).filter {
    case (sk, val) => val > current
  }
}  

这将返回一个Map[String; Int],其中值是最后一个大于作为参数给定值的值(我们保留它们的键,因为它们可能会很有用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章