2017-04-04 50 views
-1

我想排序列表第一個屬性和第二個元素的原始位置。所以Groovy - 按屬性排序,然後按原始列表索引

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

將成爲:

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

我不能一個屬性(例如 「CURRENTINDEX」)添加到地圖。是否有這樣的屬性是我可以使用的排序函數的一部分?像這樣:

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

我寧願這樣做一個常規的方式,而不是創建和排序包裝如果可能的話。

+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

你可以嘗試在你的比較使用indexOf()

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}]'