簡體   English   中英

Java ArrayList比較器

[英]Java 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]  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;
}
});

提前致謝

您希望按相反的路徑順序進行排序, 除非一條路徑延伸到另一條路徑。 一種簡單的解決方法是在比較之前,將高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;
    }
});

還請注意,使用三元運算符和優先級差來簡化代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM