我需要创建一个比较器,用几个xpath和优先级指示器对arraylist进行排序...... 第一个标准是按降序排序xpaths,第二个标准是:如果路径相同,优先级较高的路径将是第一个 以下是列表:xpath优先级
在比较之前:
/HTML[1]/BODY[1]/P[2] 5
/HTML[1]/BODY[1]/P[1]/text()[1] 2
/HTML[1]/BODY[1]/P[2]/text()[3] 2
/HTML[1]/BODY[1]/P[3]/text()[1] 4
/HTML[1]/BODY[1]/P[2]/text()[1] 1
/HTML[1]/BODY[1]/P[4]/text()[1] 3
/HTML[1]/BODY[1]/P[1]/text()[1] 3
比较后:
/HTML[1]/BODY[1]/P[4]/text()[1] 3
/HTML[1]/BODY[1]/P[3]/text()[1] 4
/HTML[1]/BODY[1]/P[2] 5
/HTML[1]/BODY[1]/P[2]/text()[3] 2
/HTML[1]/BODY[1]/P[2]/text()[1] 1
/HTML[1]/BODY[1]/P[1]/text()[1] 3
/HTML[1]/BODY[1]/P[1]/text()[1] 2
这是我到目前为止所做的,但它无法正常工作:/
Collections.sort(mods, new Comparator<TextModification>() {
@Override
public int compare(TextModification mod1, TextModification mod2)
{
//Comapre paths
int pathComp = mod2.getPath().compareTo(mod1.getPath());
//If mod2.path is "less" than mod1.path
if(pathComp < 0){
if(mod1.getPath().startsWith(mod2.getPath())){
return 1;
}
}
//Return comparison
if(pathComp != 0){
return pathComp;
}
//If paths are the same, sort by priority indicator
return mod2.getPriority() > mod1.getPriority() ? 1 : -1;
}
});
提前致谢
答案 0 :(得分:0)
当一条路径扩展另一条路径时,您希望按反向路径顺序排序,除外。一个简单的解决方法是在比较之前在路径的末尾添加一个高ascii值的字符(“z”很方便):
Collections.sort(mods, new Comparator<TextModification>() {
@Override
public int compare(TextModification mod1, TextModification mod2) {
int pathComp = (mod2.getPath() + "z").compareTo(mod1.getPath() + "z");
return pathComp == 0 ? mod2.getPriority() - mod1.getPriority() : pathComp;
}
});
还要注意使用三元运算符和优先级差异简化代码。