1

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

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

但我也想按类别对 I 进行排序,就像我展示的第一个示例一样。在 Scala 中是否有一种很好的方法可以做到这一点,或者我应该更改我的域模型?

问候,丽娜

4

2 回答 2

2

您可以通过添加另一个来完成此操作groupBy

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

或者,等效地:

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>

请注意,我还稍微调整了您的嵌套。

于 2012-09-02T11:31:04.297 回答
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>

@definingcategories借助 method ,您可以定义唯一类别列表的值distinct

于 2012-09-02T11:30:22.037 回答