我正在尝试对图像名称列表进行排序。为简单起见,我将它放在一个示例Groovy列表中:
imageNames=[
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C01.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C03.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A02Z01C04.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A03Z01C02.tif'
]
我希望能够按照图像名称后缀中出现的任何T,F,L,A,Z或C代码的数字顺序对此列表进行排序。
因此,例如,如果要按照C代码对列表进行排序,则应按以下顺序显示:
我想过使用比较器使用默认的Groovy集合排序方法。但是,我不确定如何将比较器直接写入闭包。 我想要像
这样的东西imageNames.sort {comparator_for_C}
我可以为每个T,F,L,A,Z和C代码编写特定的比较器。
答案 0 :(得分:3)
如果图像文件的名称在第二个_
之前保持不变,则可以跳过下面逻辑中的分割。我想保持安全。
def imageNames=[
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C01.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C03.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A02Z01C04.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A03Z01C02.tif'
]
def comparator = {str->
[
compare: {a,b->
a.split(/_/)[2].dropWhile{it != str} <=>
b.split(/_/)[2].dropWhile{it != str}
}
] as Comparator
}
def comp = ['T', 'F', 'A', 'Z', 'C'].collectEntries{[it, comparator(it)]}
assert imageNames.sort(comp.'C') == [
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C01.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A03Z01C02.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C03.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A02Z01C04.tif'
]
同样适用于其他字符:
imageNames.sort(comp.'A')
imageNames.sort(comp.'T') ....
答案 1 :(得分:0)
只需将比较器分开,这样就可以了 -
def comparator_for_c = { }
def sortedList = imageNames.sort(comparator_for_c)
或者也可以这样:
def comparators = [c:{}, t:{}, ...]
def sortedListForC = imageNames.sort(comparators.c)
AS示例代码:
def imageNames = ['20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C01.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A01Z01C03.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A02Z01C04.tif',
'20131018PKH26DRAQ5HOECHST1_A01_T0001F001L01A03Z01C02.tif']
def sorters = [sort_c:{a, b -> b <=> a }, sort_t:{}]
println "DefaultSort ${imageNames.sort()}"
println "c sort: ${imageNames.sort(sorters.sort_c)}"
只需将自定义比较器放入分拣机地图并调用您想要的那个。
答案 2 :(得分:0)
请考虑以下事项:
imageNames.sort { def a, def b ->
def rank = 0
def matcherA = (a =~ /.*(...)\.tif/)
def codeA = matcherA[0][1]
def matcherB = (b =~ /.*(...)\.tif/)
def codeB = matcherB[0][1]
// add your own comparison logic here as desired:
rank = codeA.compareTo(codeB)
rank
}