根据特定键对 JSONObjects 列表进行排序
Sorting the list of JSONObjects on the basis of particular key
我需要根据 "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 进行排序,我重写了比较方法。请在下面参考我的代码 -
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));
}
});
我使用一个子字符串来匹配两个字符串,就像之前的“##”一样,id 将是相同的,只是它会在“##”之后发生变化。我使用这段代码得到的排序结果是 -
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
但这不是正确的排序结果,排序后的预期结果应该是-
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-26-27
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
9721df798198##-1-2-4-9-14-16-112-113
9721df798198##-1-2-4-9-14-16-112-113-114
谁能帮我解决这个问题,我怎样才能得到预期的排序结果,谢谢你的帮助。
我不建议使用 BigInteger
来尝试进行简单的比较,因为 ID 可以是任意长度并且很快就会变得不经济。
id 基本上分为三个部分。
- 字母数字序列(
String compareTo
)
- 数字列表(转换为
int
并比较)
- 数字列表的长度(相同的序列直到短列表用完,较长的列表排序较低)
按如下方式更新您的 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;
}
我需要根据 "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 进行排序,我重写了比较方法。请在下面参考我的代码 -
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));
}
});
我使用一个子字符串来匹配两个字符串,就像之前的“##”一样,id 将是相同的,只是它会在“##”之后发生变化。我使用这段代码得到的排序结果是 -
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
但这不是正确的排序结果,排序后的预期结果应该是-
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-26-27
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
9721df798198##-1-2-4-9-14-16-112-113
9721df798198##-1-2-4-9-14-16-112-113-114
谁能帮我解决这个问题,我怎样才能得到预期的排序结果,谢谢你的帮助。
我不建议使用 BigInteger
来尝试进行简单的比较,因为 ID 可以是任意长度并且很快就会变得不经济。
id 基本上分为三个部分。
- 字母数字序列(
String compareTo
) - 数字列表(转换为
int
并比较) - 数字列表的长度(相同的序列直到短列表用完,较长的列表排序较低)
按如下方式更新您的 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;
}