我需要在" id"的基础上对JSONObjects列表进行排序。键。我正在使用collections.sort和比较器进行排序。我的ID如下所示,我需要排序 -
9721df798198 ## - 1-2
9721df798198 ## - 1-2-4
9721df798198 ## - 1-2-4-9-14-16
9721df798198 ## - 1-2-4-9-14-16-26
9721df798198 ## - 1-2-4-9-14-16-26-27
9721df798198 ## - 1-2-4-9-14-16-112
为了对这些id进行排序,我使用了覆盖比较方法。请参考下面的代码 -
var sitevalidation = $('#sitevalidation');
$('form').submit(function() {
var isValid = $('input[type="checkbox"]:checked').length > 0;
if (!isValid) {
sitevalidation.text('Please select at least one site');
return false; // cancel the submit
}
}
$('input[type="checkbox"]').click(function() {
var isValid = $('input[type="checkbox"]:checked').length > 0;
if (isValid) {
sitevalidation.text(''); // remove validation message
}
}
我使用子字符串像以前一样匹配两个字符串" ##"只有在" ##"之后它才会改变。我使用这段代码得到的排序结果是 -
Collections.sort( jsonObjList, new Comparator<JSONObject>() {
private static final String KEY_ID = "id";
public int compare(JSONObject o1, JSONObject o2) {
String str1 = new String();
String str2 = new String();
str1 = (String) o1.get(KEY_ID);
str2 = (String) o2.get(KEY_ID);
return compareString(str1, str2);
}
public int compareString(String str1, String str2){
String subString = str1.substring(str1.indexOf("##")+2, str1.length());
String subString1 = str2.substring(str2.indexOf("##")+2, str2.length());
subString = subString.replace("-","");
subString1 = subString1.replace("-","");
return new BigInteger(subString).compareTo(new BigInteger(subString1));
}
});
但这不是正确的排序结果,排序后的预期结果应为 -
9721df798198##-1
9721df798198##-1-2
9721df798198##-1-2-4
9721df798198##-1-2-4-9
9721df798198##-1-2-4-9-14-16
9721df798198##-1-2-4-9-14-16-26
9721df798198##-1-2-4-9-14-16-112
9721df798198##-1-2-4-9-14-16-26-27
9721df798198##-1-2-4-9-14-16-112-113
9721df798198##-1-2-4-9-14-16-26-27-28
9721df798198##-1-2-4-9-14-16-26-27-28-29
9721df798198##-1-2-4-9-14-16-112-113-114
请有人帮我解决这个问题,如何获得预期的排序结果,谢谢你的帮助。
答案 0 :(得分:2)
更新compateString方法,如下所示:
你需要单独比较id的每一步。
public static int compareString(String str1, String str2){
String subString = str1.substring(str1.indexOf("##")+3, str1.length());
String subString1 = str2.substring(str2.indexOf("##")+3, str2.length());
String[] array1 = subString.split("-");
String[] array2 = subString1.split("-");
for(int i=0;i< array1.length && i< array2.length;i++) {
BigInteger b1 = new BigInteger(array1[i]);
BigInteger b2 = new BigInteger(array2[i]);
if(b1.compareTo(b2) >0) //b1 is larger than b2
return 1;
if(b1.compareTo(b2) <0)
return -1;
}
if(array1.length == array2.length)//both numbers are equal
return 0;
if(array1.length > array2.length)
return 1;
return -1;
}
答案 1 :(得分:1)
我不建议使用BigInteger
来尝试进行简单的比较,当ids可以是任意长度并快速使其不经济时。
id基本上有三个部分。
String compareTo
)int
并进行比较)