Java阵列列表比较器

Java阵列列表比较器,java,sorting,xpath,arraylist,comparator,Java,Sorting,Xpath,Arraylist,Comparator,我需要创建一个比较器,用几个XPath和优先级指示器对arraylist进行排序。。。 第一个标准是按降序对XPath排序,第二个标准是:如果路径相同,则优先级较高的路径将位于第一 下面是列表: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]

我需要创建一个比较器,用几个XPath和优先级指示器对arraylist进行排序。。。
第一个标准是按降序对XPath排序,第二个标准是:如果路径相同,则优先级较高的路径将位于第一 下面是列表: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
比较后:

/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;
}
});
Collections.sort(mods,newcomparator(){
@凌驾
公共整数比较(文本修改mod1、文本修改mod2)
{
//同一路径
int-pathComp=mod2.getPath().compareTo(mod1.getPath());
//如果mod2.path比mod1.path“小”
如果(路径补偿<0){
if(mod1.getPath().startsWith(mod2.getPath())){
返回1;
}
}
//回报比较
如果(路径复合!=0){
返回路径comp;
}
//如果路径相同,则按优先级指示器排序
返回mod2.getPriority()>mod1.getPriority()?1:-1;
}
});

提前感谢

您希望按反向路径顺序排序,除非一条路径扩展另一条路径。一个简单的解决方法是在比较以下内容之前,在路径末尾添加一个高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;
    }
});
Collections.sort(mods,newcomparator(){
@凌驾
公共整数比较(文本修改mod1、文本修改mod2){
int-pathComp=(mod2.getPath()+“z”).compareTo(mod1.getPath()+“z”);
返回pathComp==0?mod2.getPriority()-mod1.getPriority():pathComp;
}
});

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

您得到了什么输出?
modn.getPath()
返回什么类型?定义无法正常工作。您的单元测试通过了吗?modn.getPath()返回数组列表中对象的xpath,modn.getPriority()返回比较后得到的xpath(整数)输出的优先级:
/HTML[1]/BODY[1]/P[4]/text()[1]3/HTML[1]/BODY[1]/P[3]/text()[1]4/HTML[1]/BODY[1]/HTML[1]/BODY[1]/P[2]5/HTML[1]/BODY[2]/text()[3]2/HTML[1]/BODY[1]/P[1]/text()[1]3/HTML[1]/BODY[1]/P[1]/text()[1]2
正如您所见,它会导致/HTML[1]/BODY[1]/P[2]出现问题……“如果路径相同,优先级较高的路径将优先”如果路径相同,优先级会有什么区别?在每个路径写入编号(指示优先级)之后,如果您有:
/HTML[1]/BODY[1]/P[1] /text()[1]1
/HTML[1]/BODY[1]/P[1]/text()[1]3
它们将以这种方式排序
/HTML[1]/BODY[1]/P[1]/text()[1]3/HTML[1]/BODY[1]/P[1]/text()[1]1