我如何在Scala中进行分组

时间:2012-09-02 10:23:47

标签: scala playframework

建立一个网站(我是网络和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

但我也想按类别排序,就像我展示的第一个例子。有没有一种很好的方法在Scala中执行此操作,还是应该更改我的域模型?

问候,莉娜

2 个答案:

答案 0 :(得分: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>

请注意,我还调整了你的嵌套。

答案 1 :(得分: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