Java ArrayList Comparator

时间:2014-04-01 14:37:58

标签: java sorting xpath arraylist comparator

我需要创建一个比较器,用几个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;
}
});

提前致谢

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

还要注意使用三元运算符和优先级差异简化代码。