2016-09-25 6 views
1

"id"키를 기준으로 JSONObject 목록을 정렬해야합니다. collections.sort와 비교자를 사용하여 정렬하고 있습니다. 내가 정렬 할 필요가 다음과 같이 내 IDS는 -특정 키를 기준으로 JSONObject 목록 정렬

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를 정렬하기 위해 override 메소드를 비교했습니다. 아래에있는 내 코드를 참조하십시오 -

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 메소드를 다음과 같이 업데이트하십시오.

u는 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

ID를 길이에 관계없이 쉽게 비교할 수 있고 경제적이지 않은 경우에 쉽게 비교할 수 있도록 BigInteger을 사용하지 않는 것이 좋습니다.

이드에는 기본적으로 세 부분이 있습니다. 숫자의

  1. 영숫자 순서 (String compareTo)
  2. 목록 숫자 목록의
  3. 길이 (int로 변환하고 비교)
(짧은 목록이 다 할 때까지 같은 순서를, 긴 목록은 아래 정렬됩니다)
+0

코드를 게시 할 수는 있지만 먼저 알아야합니다. – donkon