根据特定键对 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 基本上分为三个部分。

  1. 字母数字序列(String compareTo
  2. 数字列表(转换为 int 并比较)
  3. 数字列表的长度(相同的序列直到短列表用完,较长的列表排序较低)

按如下方式更新您的 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;

}