【问题标题】:Java ArrayList ComparatorJava ArrayList 比较器
【发布时间】:2014-04-01 14:37:57
【问题描述】:

我需要创建一个比较器来使用几个 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

这是我目前所拥有的,但它无法正常工作:/

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

提前致谢

【问题讨论】:

  • 你得到了什么输出? modn.getPath() 返回什么类型?
  • 定义不能正常工作。你的单元测试通过了吗?
  • modn.getPath() 返回数组列表中对象的 xpath,modn.getPriority() 返回 xpath(int number) 的优先级 比较后得到的输出:/HTML[1]/BODY[1]/P[4]/text()[1] 3 /HTML[1]/BODY[1]/P[3]/text()[1] 4 /HTML[1]/BODY[1]/P[2]/text()[1] 1 /HTML[1]/BODY[1]/P[2] 5 /HTML[1]/BODY[1]/P[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

标签: java sorting xpath arraylist comparator


【解决方案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;
    }
});

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2016-08-08
    • 1970-01-01
    • 2014-01-01
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多