2012-09-02 81 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'兩次可以更簡潔地完成相同的事情並具有更好的性能特徵。 –