2016-09-25 80 views
1

我需要根据“id”键对JSONObjects列表进行排序。我正在使用collections.sort和比较器进行排序。我的ID如下,我需要进行排序 -根据特定键排序JSONObjects列表

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 

请任何人可以帮助我在此,我怎么能得到预期的分类结果,感谢您的帮助。

+0

您正在为每行创建一个巨大的数字。显然,时间越长越高。你需要做的是将每行分割并解析为一个int数组,然后按照字典顺序比较数组。 – shmosel

+1

你在使用java-8吗? –

+0

@RamachandranGA其java7 –

回答

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; 

} 
+0

你为什么使用'BigInteger'? – shmosel

+0

@shmosel因为它提供了更多的容量 –

1

我不建议使用BigInteger来尝试和简单比较,当ids可以是任何长度,并迅速使其不经济。

本质上有三个部分。数字

  1. 字母数字序列(String compareTo
  2. 列表(转换为int和比较)的数字列表的
  3. 长(直至短名单用完相同的序列,长列表进行排序更低)
+0

我可以发布代码,但你应该先出来。 – donkon