2012-09-02 34 views
1

构建一个网站(我是网络和Scala和Playframework的新手,但有很多编程经验)并尝试打印出我的网域模型的一部分。我有一个域类型 - >目标 - >任务。任务知道目标和目标知道该类别。现在我想将其打印出来这样如何在Scala中组合

Category1 
    Goal1 
     Activity1 
    Goal2 
     Activity2 
     Activity3 

我使用Scala和已经做到了这一点:

@tasks.groupBy(_.goal).map { case (goal, tasks) => 
    <ul> 
     <li>@goal.name</li> 
     <ul> 
      @tasks.map { task => 
       <li>@task.name</li> 
      } 
     </ul> 
    </ul> 
} 

所以现在它的排序是这样的:

Goal1 
    Activity1 
Goal2 
    Activity2 
    Activity3 

但我还想按类别对我进行排序,就像我展示的第一个例子。有没有在斯卡拉这样做的好方法,或者我应该改变我的领域模型?

问候,丽娜

回答

2

您可以通过添加另一个groupBy做到这一点

tasks.groupBy(_.goal).groupBy(_._1.category) 

这只是类别将带您从您目前的做法和组它获取地图的目标键,给你一个Map[Category, Map[Goal, Seq[Task]]],你可以这样使用:

<ul> 
    @tasks.groupBy(_.goal).groupBy(_._1.category).map { case (category, goals) => 
    <li>@category.name 
     <ul> 
     @goals.map { case (goal, tasks) => 
      <li>@goal.name 
      <ul> 
       @tasks.map { task => <li>@task.name</li> } 
      </ul> 
      </li> 
     } 
     </ul> 
    </li> 
    } 
</ul> 

请注意,我也调整了一下你的嵌套。

+0

太棒了,谢谢! – Lina

1

我不知道这是最简单的方法,但是:

<ul> 
    @defining(tasks.map(_.goal.category).distinct) {categories => 
     @categories.map{category => 
      <li> 
       @category.name 
      </li> 
      <ul> 
       @tasks.filter(_.goal.category == category).groupBy(_.goal).map{ case (goal, tasks) => 
        <ul> 
         <li>@goal.name</li> 
         <ul> 
          @tasks.map {task => 
           <li>@task.name</li> 
          } 
         </ul> 
        </ul> 
       } 
      </ul> 
     } 
    } 
</ul> 

@defining允许您定义值categories这是唯一的类别列表,这要归功于方法distinct

tasks.groupBy(_.goal).groupBy { case (goal, _) => goal.category } 

,或等效:

+0

使用'groupBy'两次可以更简洁地完成相同的事情并具有更好的性能特征。 –