groovy / grails,我无法从地图中删除

时间:2011-11-08 19:57:33

标签: grails groovy

你能帮我辨别下面地图中简单删除的错误吗(在它下面注意输出)?

  public class Issue {
  ...

  def allButThis() {
    println "allButThis ..."
    def all = Issue.list()
    println "all is ${all}"
    all.remove(this.id)
    println "all with ${this.id} removed: ${all}"
    return all
  }

   String toString() {return "${id}: ${title}"}

当我运行时,我得到以下结果,即项目2未按预期删除

  allButThis ...
  all is [1: Issue-1, 2: Issue-2, 3: Issue-3]
  all with 2 removed: [1: Issue-1, 2: Issue-2, 3: Issue-3]

据我所知,此删除应该可行,例如http://groovy.codehaus.org/JN1035-Maps,其中“删除”在页面下方描述了三分之一。

我正在使用Grails 1.3.7。

谢谢

P.S。我添加了我的toString()方法(上面),也许我自欺欺人了。

-------------更新----------

我删除了我的toString()方法,并遵循Rob的解决方案,即:

  all.remove(this)
  println "all with ${this} removed: ${all}"

产生:

 all is [momentum.Issue : 1, momentum.Issue : 2, momentum.Issue : 3]
 all with momentum.Issue : 2 removed: [momentum.Issue : 1, momentum.Issue : 3]

2 个答案:

答案 0 :(得分:6)

def all = Issue.list()

这是一个列表,而不是地图。

所以要从此列表中删除:

all.remove(this)

代替。

答案 1 :(得分:1)

this.id的类型为Long,因此,如果要删除第n项,则需要将其转换为整数。然而这是非常危险的,因为id的输入并不总是第n个条目。使用.findAll({it.id != this.id})删除此项目会更省钱。

在这种情况下,我建议你这样做:

def allExceptThis = Issue.withCriteria {
   ne("id", this.id)
}.list();