0

我正在使用播放框架和 Scala。

我有以下列表-

 List(
    (C: - read,1412750402124,46552070),
    (C: - write,1412750402124,433057), 
(E: - read,1412750402124,5435),  
(E: - write,1412750402124,1728),
(F: - read,1412750402124,5435),  
(F: - write,1412750402124,1728), 
(C: - read,1412750402125,46552071), 
(C: - write,1412750402125,433060),
(E: - read,1412750402125,5445), 
(E: - write,1412750402125,1730),
(F: - read,1412750402125,5450),  
(F: - write,1412750402125,1428)
)

我想要以下输出-

    key:[
{"name":"C:-read",
data:[[1412750402124,46552070],[1412750402125,46552071]...]
},
{
"name":"C:-write",
data:[[1412750402124,433057],[1412750402125,433060]...]
},
{
"name":"E:-read",
data:[[1412750402124,5435],[1412750402125,5445]...]
},
{
"name":"E:-write",
data:[[1412750402124,1728],[1412750402124,1730]...]
},
{
"name":"F:-read",
data:[[1412750402124,5435],[1412750402125,5450]...]
},
{
"name":"F:-write",
data:[[1412750402124,1728],[1412750402124,1428]...]
}
]

如何使用 scala 获得以上输出?

4

1 回答 1

1

输入列表无法编译,并且缺少一些信息,所以我做了一些假设。

val lst = List(
  ("C: - read", 1412750402124L, 46552070),
  ("C: - write", 1412750402124L, 433057),
  ("E: - read", 1412750402124L, 5435),
  ("E: - write", 1412750402124L, 1728),
  ("F: - read", 1412750402124L, 5435),
  ("F: - write", 1412750402124L, 1728),
  ("C: - read", 1412750402125L, 46552071),
  ("C: - write", 1412750402125L, 433060),
  ("E: - read", 1412750402125L, 5445),
  ("E: - write", 1412750402125L, 1730),
  ("F: - read", 1412750402125L, 5450),
  ("F: - write", 1412750402125L, 1428))

由于结果是按第一个字符串分组的(例如“C: - read”),第一步是进行分组:

scala> val groupedData= lst.groupBy(_._1).map{ case (k,v) => k -> v.map(i => List(i._2, i._3))}.toList
groupedData: List[(String, List[List[Long]])] = List((C: - write,List(List(1412750402124, 433057), List(1412750402125, 433060))), (E: - read,List(List(1412750402124, 5435), List(1412750402125, 5445))), (F: - write,List(List(1412750402124

, 1728), List(1412750402125, 1428))), (F: - 读,List(List(1412750402124, 5435), List(1412750402125, 5450))), (E: - 写,List(List(1412750402124, 1728) ), List(1412750402125, 1730))), (C: - read,List(List(1412750402124, 46552070), List(1412750402125, 46552071))))

请注意,结果是List[(String, List[List[Long]])]。这将使序列化更容易。
Play 有很棒的 Json 库,可以通过“Writes”轻松完成:

implicit val itemWrites = new Writes[(String, List[List[Long]])] {
  def writes(t: (String, List[List[Long]])) = Json.obj(
    "name" -> t._1,
    "data" -> t._2)
}

现在可以序列化了:

scala> Json.toJson(groupedData)
res23: play.api.libs.json.JsValue = [{"name":"C: - write","data":[[1412750402124,433057],[1412750402125,433060]]},{"name":"E: - read","data":[[1412750402124,5435],[1412750402125,5445]]},{"name":"F: - write","data":[[1412750402124,1728]

,[1412750402125,1428]]},{"name":"F: - 读取","data":[[1412750402124,5435],[1412750402125,5450]]},{"name":"E: - 写入","数据":[[1412750402124,1728],[1412750402125,1730]]},{"名称":"C:-读取","数据":[[1412750402124,46552070],[141275040212 5,46552071] ]}]

于 2014-10-11T09:13:23.027 回答