如何从枚举中创建Seq

时间:2014-08-02 19:19:13

标签: scala playframework sequence

我有一个类似的枚举:

object ContentType extends Enumeration {
  type ContentType = Value
  val BlogPost, KB, Link = Value
}

现在我想使用此枚举创建一个下拉列表。

@helper.select(field = ContentForm("contentType"), options = @contentTypes)

Play有@helper.select方法,需要一个序列,所以我添加了一个序列,我将传递给我的视图页面:

val contentTypes: Seq[(Int, String)] = ...

如何从ContentType枚举初始化或创建此序列?

更新

抱歉,它必须是Seq [(String,String)]

类型

1 个答案:

答案 0 :(得分:5)

我不清楚为什么val contentTypes类型为Seq[(Int, String)],也许我错过了某些内容,但您可以将Enumeration转换为{{ 1}}所以:

Seq

编辑:

从@Marth评论,使用scala> object ContentType extends Enumeration { | type ContentType = Value | val BlogPost, KB, Link = Value | } defined module ContentType scala> ContentType.values.toSeq res0: Seq[ContentType.Value] = ArrayBuffer(BlogPost, KB, Link) zipWithIndex

swap

如果您需要scala> ContentType.values.toSeq.map(_.toString).zipWithIndex.map(_.swap) res5: Seq[(Int, String)] = ArrayBuffer((0,BlogPost), (1,KB), (2,Link))

Seq[(String, String)]

一步一步:

scala>  ContentType.values.toSeq.map(_.toString).zipWithIndex.map(tuple => (tuple._2.toString, tuple._1))
res6: Seq[(String, String)] = ArrayBuffer((0,BlogPost), (1,KB), (2,Link))

返回ContentType.values.toSeq ,然后调用Seq[ContentType.Value]返回.map(_.toString),您现在希望每个Seq[String]都与数字标识符相关联,我们使用每个值的索引,String创建zipWithIndex个元组,其中第一个值为Seq,第二个值为String所在的索引:

String

我们就在那里,所需的类型是scala> ContentType.values.toSeq.map(_.toString).zipWithIndex res7: Seq[(String, Int)] = ArrayBuffer((BlogPost,0), (KB,1), (Link,2) 我们有一个Seq[(String, String)],另请注意,我认为您希望元组属于Seq[(String, Int)],而我们现在有(index, value),所以我们再次映射有两个原因,第一个是交换值,第二个是将索引转换为字符串:

(value, index)

我们还可以缩短删除第一个地图的代码,该地图将我们的自定义类型转换为字符串并延迟上一个地图中的scala> ContentType.values.toSeq.map(_.toString).zipWithIndex.map(tuple => (tuple._2.toString, tuple._1)) res8: Seq[(String, String)] = ArrayBuffer((0,BlogPost), (1,KB), (2,Link)) 调用,具有以下内容:

toString