Scala group由一个元组来计算股票基础

时间:2016-06-27 22:40:13

标签: scala tuples

我正在进行一项计算股票基础的练习,给出了以股票(股票代码,数量,股票价格)形式的股票购买清单。我已经让它工作了,但是想以更多的功能方式进行计算。有人对此有答案吗?

// input: 
// List(("TSLA", 20, 200),
//      ("TSLA", 20, 100),
//      ("FB", 10, 100)
// output:
// List(("FB", (10, 100)), 
//      ("TSLA", (40, 150))))

def generateBasis(trades: Iterable[(String, Int, Int)]) = { 
  val basises = trades groupBy(_._1) map {
    case (key, pairs) =>
      val quantity = pairs.map(_._2).toList
      val price = pairs.map(_._3).toList
      var totalPrice: Int = 0
      for (i <- quantity.indices) {
        totalPrice += quantity(i) * price(i)
      }
      key -> (quantity.sum, totalPrice / quantity.sum)
    }
  basises
}

2 个答案:

答案 0 :(得分:2)

这看起来可能适合您。 (的更新

def generateBasis(trades: Iterable[(String, Int, Int)]) =
  trades.groupBy(_._1).mapValues {
    _.foldLeft((0,0)){case ((tq,tp),(_,q,p)) => (tq + q, tp + q * p)}
  }.map{case (k, (q,p)) => (k,q,p/q)}   // turn Map into tuples (triples)

答案 1 :(得分:0)

我想出了下面的解决方案。感谢大家的投入。我很想知道是否有人有更优雅的解决方案。

// input:
// List(("TSLA", 20, 200),
//      ("TSLA", 10, 100),
//      ("FB", 5, 50)
// output:
// List(("FB", (5, 50)),
//      ("TSLA", (30, 166)))
def generateBasis(trades: Iterable[(String, Int, Int)]) = {

  val groupedTrades = (trades groupBy(_._1)) map {
    case (key, pairs) =>
      key -> (pairs.map(e => (e._2, e._3)))
  } // List((FB,List((5,50))), (TSLA,List((20,200), (10,100))))

  val costBasises = for {groupedTrade <- groupedTrades

    tradeCost = for {tup <- groupedTrade._2 // (qty, cost)
    } yield tup._1 * tup._2 // (trade_qty * trade_cost)

    tradeQuantity = for { tup <- groupedTrade._2
    } yield tup._1 // trade_qty

  } yield (groupedTrade._1, tradeQuantity.sum, tradeCost.sum / tradeQuantity.sum )

  costBasises.toList // List(("FB", (5, 50)),("TSLA", (30, 166)))
}