基于特定键对JSONObjects列表进行排序

时间:2016-09-25 06:04:02

标签: java sorting collections jsonobject

我需要在" 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

请有人帮我解决这个问题,如何获得预期的排序结果,谢谢你的帮助。

2 个答案:

答案 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基本上有三个部分。

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