2011-11-08 13 views
1

以下のマップから簡単な削除で何が間違っているのかを教えてください。私の知る限り groovy/grails、マップから削除することができません

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] 

を期待通りに

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項目が削除されていない、この削除が動作するはずです、あたり例えばhttp://groovy.codehaus.org/JN1035-Mapsここで、「削除」はページの3分の1に記載されています。

Grails 1.3.7を使用しています。

ありがとう

P.S.私はtoString()メソッド(上記)を追加しました。おそらく私は自分自身をだましていました。

-------------更新----------私は私のtoString()メソッドを除去し、すなわち、ロブのソリューション、続い

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] 

答えて

1

this.idLongであるため、n番目のアイテムを削除する場合は、整数に変換する必要があります。しかし、これは非常に危険です。なぜなら、idのエントリは常にn番目のエントリではないからです。 .findAll({it.id != this.id})を使用してこのアイテムを削除すると保存されます。

この場合、私はこのようにそれを行うためにあなたをお勧めします:

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

ありがとうCrudolf。私は、 ".findAll"がより安全であることについてちょっと混乱していますが、.withCriteriaを推奨しました。展開していただけますか? – Ray

+0

混乱のために申し訳ありません: 'findAll'の代わりに' withCriteria'を使うのは安全です。しかし、私はソフトウェア層ではなくデータベース層で「これ」を除外します。したがって、同じ 'id'を持つオブジェクトを除外するクエリを作成する必要があります。このケースでは、「findAll」条件よりもwithCriteriaが好きです。上記のようにすると、後でコレクションを操作する必要はありません。 – Chris

+0

Crudolf、これは私にとって理にかなっていることです。データベースレイヤーでやります。しかし、なぜあなたが.withCriteriaの方が好きなのか、まだわかりません.findAllよりも理解したいと思います。私は使用して幸せです。withCriteriaは、なぜそれがfindAllと異なるのかを理解したいだけです。それはコードを行うためのほんの明確な方法なのでしょうか?ありがとう – Ray

6
def all = Issue.list() 

をこのリストではなく、マップです。

all.remove(this) 

代わり:だから、このリストから削除する

+0

ロブ、私はあなたが言ったことに(一番下)私の質問を補足し、それが働きました。上記のように、なぜ「これ」が持っている価値を持っているのか教えていただけますか? – Ray

+0

...明らかに "this"はデフォルトの文字列メソッドに実行されますが、これは意味があります。それをall.remove(これ)に渡すことは、ちょっと思ったけど...確かに私をだまして、文字列に評価して渡された。 – Ray

+0

...リストのremove()に渡された "this"参照が、toString()を実行してString型に変換されたとします。 – Ray

関連する問題