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