为groovy

时间:2016-02-08 07:37:59

标签: groovy

我在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);
    }

2 个答案:

答案 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()
}