2017-04-04 52 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}]'