【问题标题】:Play Framework how to sort collection in repeat() form helper?Play Framework如何在repeat()表单助手中对集合进行排序?
【发布时间】:2015-04-25 21:46:20
【问题描述】:

基于the Play (java) documentation,假设我有以下示例:

public class UserForm {
    public String name;
    public List<MyClass> itmes;
}

@helper.inputText(userForm("name"))

@helper.repeat(userForm("items"), min = 1) { itemField =>

    @helper.inputText(itemField)

}

但是,在MyClass 中,我有一个覆盖了compareTo() 的实现。我还有一个 getter getSortedItems(),它将以正确的排序顺序返回列表。

目前,使用 repeat() 帮助器无法按我想要的顺序获得我的项目列表。 有没有办法指定repeat() 助手的顺序? 或者我可以给它一个List 作为参数吗?看来这在 Scala 中是可能的。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 有什么原因没有按适当的排序顺序填充项目?
  • @ArneClaassen 我似乎无法控制它。有时它们会以默认顺序填充,然后如果我更新列表中的一个项目,它会被推到列表的末尾。我希望能够强制执行排序

标签: forms scala playframework playframework-2.3


【解决方案1】:

您可以将List&lt;MyClass&gt; 替换为排序集:

case class MyClass(id: Int, name: String)
val sorted = new mutable.TreeSet[MyClass]()(new Ordering[MyClass] {
  def compare(a: MyClass, b: MyClass): Int = {
    Ordering.Int.compare(a.id,b.id)
  }
})
sorted.add(MyClass(2,"bob"))
sorted.add(MyClass(1,"bill"))
sorted.add(MyClass(3,"jane"))

我假设该列表将仅包含 MyClass 的唯一实例,因此集合应该可以正常工作,并且每次添加项目时,集合都会确保它保持排序状态。

java 版本应该很接近:

import java.util.Comparator;
import java.util.TreeSet;

public class MyClass {
    public int id;
    public String name;
}

public class MyClassComparator implements Comparator<MyClass> {

    @Override
    public int compare(MyClass a, MyClass b) {
       return Integer.compare(a.id,b.id);
    }
}

TreeSet<MyClass> sorted = new TreeSet<>(new MyClassComparator());

【讨论】:

  • 很遗憾,我对 Scala 不是很熟悉,你有 Java 的例子吗?
  • 其实我想我明白了。我会尝试TreeSet 的项目。
  • 所以我在我的项目中尝试了这个,我得到了一个例外:play.api.Application$$anon$1: Execution exception[[InvalidPropertyException: Invalid property 'fields[1]' of bean class [models.CSVData]: Illegal attempt to get property 'fields' threw exception; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'fields[1]' of bean class [models.CSVData]: Cannot get element with index 1 from Set of size 0, accessed using property path 'fields[1]']]。以这种方式使用带有 Sets 的 Ebean 可能存在一些问题?或者它可能是我的代码中的其他问题
  • 该错误似乎表明该集为空,因为它未能获取索引 1 并声称该集的大小为 0。该集是否可能未正确初始化?
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2011-02-10
相关资源
最近更新 更多