【问题标题】:groovy/grails, am not able to remove from mapgroovy/grails,无法从地图中删除
【发布时间】:2011-11-09 04:42:53
【问题描述】:

你能帮我找出从下面的地图中简单删除的问题(注意它下面的输出)吗?

  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。

谢谢

附:我添加了我的 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]

【问题讨论】:

    标签: grails groovy


    【解决方案1】:
    def all = Issue.list()
    

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

    所以要从这个列表中删除:

    all.remove(this)
    

    改为。

    【讨论】:

    • Rob,我用你所说的话补充了我的问题(在底部),它奏效了。你能告诉我为什么“this”有它的价值,如上图所示?
    • ... 显然“this”执行到默认的字符串方法,这是有道理的。将它传递给 all.remove(this) 似乎有点奇怪......当然愚弄了我,它评估为一个字符串然后被传递。
    • ... 我应该说传递给列表中 remove() 的“this”引用被转换为它的字符串形式(通过执行 toString())。
    • 列表有一个不错的 toString,所以当你执行 "${all}" 时,它会在后台调用 toString,它会在每个元素成员上调用 toString。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢克鲁道夫。我对“.findAll”更安全有点困惑,但后来你推荐了.withCriteria。你能扩展一下吗?
    • 抱歉混淆:使用withCriteria 代替findAll 并不安全。但我不会在软件层而是在数据库层排除“这个”。因此,您需要创建一个查询,排除具有相同id 的对象。在这种情况下,我更喜欢 withCriteria 而不是 findAll 条件。请注意,执行上述操作后,您无需再操作集合了!
    • Crudolf,这对我来说很有意义——在数据库层进行。但仍然不清楚为什么您更喜欢 .withCriteria 而不是 .findAll,我想了解这一点。我很高兴使用 .withCriteria,只是想了解为什么它与 findAll 不同。它只是一种更清晰的代码编写方式,这就是你更喜欢它的原因吗?谢谢
    • withCriteria 将准备并执行 SQL 查询。 findAll 是集合 API 的一部分,将在软件层(现有集合上)进行过滤。
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多