[英]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.