我在groovy上课
class WhsDBFile {
String name
String path
String svnUrl
String lastRevision
String lastMessage
String lastAuthor
}
和地图对象
def installFiles = [:]
通过
填充循环WhsDBFile dbFile = new WhsDBFile()
installFiles[svnDiffStatus.getPath()] = dbFile
现在我尝试使用自定义Comparator对其进行排序
Comparator<WhsDBFile> whsDBFileComparator = new Comparator<WhsDBFile>() {
@Override
int compare(WhsDBFile o1, WhsDBFile o2) {
if (FilenameUtils.getBaseName(o1.name) > FilenameUtils.getBaseName(o2.name)) {
return 1
} else if (FilenameUtils.getBaseName(o1.name) > FilenameUtils.getBaseName(o2.name)) {
return -1
}
return 0
}
}
installFiles.sort(whsDBFileComparator);
但是会收到此错误java.lang.String cannot be cast to WhsDBFile
知道怎么解决这个问题吗?我需要使用自定义比较器,因为它将来会更加复杂。
P.S。示例gradle任务的完整源代码(上面是WhsDBFile类的描述):
project.task('sample') << {
def installFiles = [:]
WhsDBFile dbFile = new WhsDBFile()
installFiles['sample_path'] = dbFile
Comparator<WhsDBFile> whsDBFileComparator = new Comparator<WhsDBFile>() {
@Override
int compare(WhsDBFile o1, WhsDBFile o2) {
if (o1.name > o2.name) {
return 1
} else if (o1.name > o2.name) {
return -1
}
return 0
}
}
installFiles.sort(whsDBFileComparator);
}
答案 0 :(得分:2)
您可以尝试对entrySet()进行排序:
def sortedEntries = installFiles.entrySet().sort { entry1, entry2 ->
entry1.value <=> entry2.value
}
您将拥有此调用的Map.Entry集合。为了得到一个地图,你可以收集结果()结果:
def sortedMap = installFiles.entrySet().sort { entry1, entry2 ->
...
}.collectEntries()
答案 1 :(得分:1)
sort
也可以将闭包作为参数,该参数强制使用Comparator
compare()
方法,如下所示。 toUpper()
方法的使用只是模仿FilenameUtils.getBaseName()
。
installFiles.sort { a, b ->
toUpper(a.value.name) <=> toUpper(b.value.name)
}
// Replicating implementation of FilenameUtils.getBaseName()
// This can be customized according to requirement
String toUpper(String a) {
a.toUpperCase()
}