2017-04-04 4 views
-1

リストを最初にプロパティでソートしようとしていますが、もう1つは元のエレメントの配置でソートしようとしています。だから、Groovy - プロパティでソートしてから元のインデックスのインデックスに戻す

[[primaryProperty:2,foo:a],[primaryProperty:1,foo:c],[primaryProperty:1,foo:b]] 

はなるだろう:私はマップにプロパティ(例えば "currentIndex")を追加することはできません

[[primaryProperty:1,foo:c],[primaryProperty:1,foo:b],[primaryProperty:2,foo:a]] 

。私が使用できるソート関数の一部であるようなプロパティはありますか?私はこれに、むしろ、可能な場合ラッパーを作成し、ソートよりグルーヴィーな方法を行うことを好むだろう

list.sort{ a, b -> 
      Integer returnVal = b.primaryProperty <=> a.primaryProperty 
      if(returnVal==0) { 
       return a.index <=> b.index 
      } else { 
       return returnVal 
      } 
     } 

:ような何か。あなたのコンパレータでindexOf()を使用して試みることができる

+0

'地図にプロパティ(例:「currentIndex」)を追加できません - なぜですか? – injecteer

+0

これは実際に私のコード内のオブジェクトです。私は例を挙げていただけです。 – Anonymous1

答えて

0

injecteerの答えは、問題を解決するかもしれないが、indexOfの演算子の繰り返し使用は、それが非効率的になるだろう。私はラッパーを並べ替え、リストの周りにラッパーを作ることになった、とその結果のリストからデータを取得:

List wrapper = objList.withIndex().collect{ obj, index -> [obj: obj, index: index] } 
wrapper.sort{ ... } 
List sortedObjList = wrapper.collect{ it.obj } 

それが仲介するオブジェクトの束の作成が含まれてそれは理想的ではないですが、それを取得します仕事が終わった。

0

def list = [[primaryProperty:2,foo:'a'],[primaryProperty:1,foo:'c'],[primaryProperty:1,foo:'b']] 

list = list.sort{ a, b -> 
      Integer returnVal = a.primaryProperty <=> b.primaryProperty 
      if(returnVal==0) { 
       return list.indexOf(a) <=> list.indexOf(b) 
      } else { 
       return returnVal 
      } 
     } 

    assert list.toString() == '[{primaryProperty=1, foo=c}, {primaryProperty=1, foo=b}, {primaryProperty=2, foo=a}]' 
関連する問題