개발/Java

[Java] Json Array 정렬

Jindory 2022. 3. 6. 15:37
반응형

안녕하세요. 개발자 Jindory입니다.

오늘은 JsonArray의 값들을 정렬해보고자 합니다.

우선 Json Array에 값들을 정렬하기 위해 데이터부터 만들어 보겠습니다.


1. JsonArray값 생성

public static void main(String[] args) throws Exception {
	JSONObject jsonObject1 = new JSONObject();
    JSONObject jsonObject2 = new JSONObject();
    JSONObject jsonObject3 = new JSONObject();
    JSONObject jsonObject4 = new JSONObject();
    JSONArray jsonArray = new JSONArray();
    jsonObject1.put("grade", "1");
    jsonObject1.put("class", "2");
    jsonObject1.put("num","3");
    jsonObject1.put("name","D");
    jsonArray.add(jsonObject1);

    jsonObject2.put("grade", "2");
    jsonObject2.put("class", "3");
    jsonObject2.put("num","4");
    jsonObject2.put("name","A");
    jsonArray.add(jsonObject2);

    jsonObject3.put("grade", "3");
    jsonObject3.put("class", "4");
    jsonObject3.put("num","1");
    jsonObject3.put("name","B");
    jsonArray.add(jsonObject3);

    jsonObject4.put("grade", "4");
    jsonObject4.put("class", "1");
    jsonObject4.put("num","2");
    jsonObject4.put("name","C");
    jsonArray.add(jsonObject4);

    for(int loop=0;loop<jsonArray.size();loop++) {
        System.out.println(loop+" : "+jsonArray.get(loop));
    }
}

데이터가 아래와 같이 생성됨을 알 수 있습니다.

2. JsonArray값 비교함수 작성

public static JSONArray sortJson(JSONArray list,String item,String order)
{
    JSONArray sortedJsonArray = new JSONArray();
    JSONArray jsonValues = new JSONArray();

    int direction;

    if(order.equals("asc")) {
        direction = 1;
    }else {
        direction = -1;
    }

    for (int index = 0; index < list.size(); index++) {
        jsonValues.add(list.get(index));
    }

    // Collections의 sort 메서드로 JsonArray를 정렬 정렬 기준은 new Comparator<JSONObject>()로 정의 후 반환(1:오름/-1:내림/0:같음)
    Collections.sort( jsonValues, new Comparator<JSONObject>() {

        // 정렬할 type을 KEY_NAME에 정의
        String KEY_NAME = item;

        @Override
        public int compare(JSONObject a, JSONObject b) {
            // 비교할 값들 선언 valA,valB 비교할 값들이 숫자일 경우를 대비하여 A,B 선언
            String valA = new String();
            String valB = new String();
            float A = 0.0f;
            float B = 0.0f;

            try {
                // JSONObject의 KEY_NAME에 해당하는 값 저장
                valA = (String) a.get(KEY_NAME);
                valB = (String) b.get(KEY_NAME);
                // 만일 가져온 값이 숫자일 경우 A,B에 저장
                if(valA.matches("[+-]?\\d*(\\.\\d+)?") && valA.matches("[+-]?\\d*(\\.\\d+)?")) {
                    A = Float.parseFloat(valA);
                    B = Float.parseFloat(valB);
                }

            }
            catch (JsonParseException e) {
                //do something
                System.out.println("An error occurred while extracting the JSON value");
            }
            // 입력한 값 둘다 숫자일 경우 숫자 비교
            if(valA.matches("[+-]?\\d*(\\.\\d+)?") && valB.matches("[+-]?\\d*(\\.\\d+)?")) {
                if(A>B) {
                    return 1*direction;
                }else if(A<B) {
                    return -1*direction;
                }else {
                    return 0*direction;
                }
            }else {		
                // 입력한 값이 문자일 경우 문자비교  valA가 valB보다 값이 크면 양수 valA와 valB가 같으면 0 valA가 valB보다 값이 작으면 음수 반환
                if(order.equals("asc")) {
                    return valA.compareTo(valB);
                }else {
                    return valB.compareTo(valA);
                }
            }

        }
    });

    for (int i = 0; i < jsonValues.size(); i++) {
        sortedJsonArray.add(jsonValues.get(i));
    }

    return sortedJsonArray;
}

JsonArry를 정렬할때 정렬할 JsonArray, 정렬의 기준이 될 item의 값, 오름내림차순에 대한 파라미터를 sortJson에 넘겨준다.

sortJson 메서드는 아래와 같이 동작한다.

  1. 전달받은 jsonArray list 데이터를 jsonValue에 임시 저장한다.
  2. Collections sort 메서드는 전달받은 객체를 정렬하는 메서드로써, 단일 자료형일경우 리스트 객체의 값을 비교하며 정렬하지만, Class 객체일 경우 어떤 멤버변수를 기준으로 정렬해야하는지 판단할 수 없기 때문에 Comparator를 통해 정렬 기준을 정의해줘야 한다.
  3. compare라는 메서드롤 통해 객체 비교 후 반환할 값을 정의한다.
    1. 먼저 비교할 값(item)을 valA와 valB에 저장한다.
      1. 가져 올 객체가 문자일 경우 valA와 valB에만 저장한다.
      2. 가져 올 객체가 숫자일 경우 A와 B에 저장한다.
    2. 비교할때 문자열과 숫자일 경우를 나눠서 반환값을 정한다.
      1. 숫자일 경우 A가 B보다 클 경우
        1. 순방향 1 반환
        2. 역방향 -1 반환
        3. 같을경우 0 반환
      2. 문자열 경우 valA가 valB보다 사전순으로 앞서면 양수, valA와 valB가 사전순으로 같으면 0, 사전순으로 뒤에 있으면 음수 반환
        1. 순방향일경우 양수반환
        2. 역방향일경우 음수반환

위 과정을 통해 JsonArray 값을 정렬한다.

3. 정렬된 JsonArray값 확인

JSONArray sortGrade = new JSONArray();
JSONArray sortClass = new JSONArray();
JSONArray sortNum = new JSONArray();
JSONArray sortName = new JSONArray();
JSONArray sortGradeDesc = new JSONArray();
JSONArray sortClassDesc = new JSONArray();
JSONArray sortNumDesc = new JSONArray();
JSONArray sortNameDesc = new JSONArray();
sortGrade = sortJson(jsonArray,"grade","asc");
sortClass = sortJson(jsonArray,"class","asc");
sortNum = sortJson(jsonArray,"num","asc");
sortName = sortJson(jsonArray,"name","asc");
sortGradeDesc = sortJson(jsonArray,"grade","desc");
sortClassDesc = sortJson(jsonArray,"class","desc");
sortNumDesc = sortJson(jsonArray,"num","desc");
sortNameDesc = sortJson(jsonArray,"name","desc");

System.out.println("=============================== Grade 기준으로 오름차순 정렬 ===============================");
for (int i = 0; i < sortGrade.size(); i++) {
    System.out.println(sortGrade.get(i));
}

System.out.println("=============================== Class 기준으로 오름차순 정렬 ===============================");
for (int i = 0; i < sortClass.size(); i++) {
    System.out.println(sortClass.get(i));
}

System.out.println("=============================== Num 기준으로 오름차순 정렬 ===============================");
for (int i = 0; i < sortNum.size(); i++) {
    System.out.println(sortNum.get(i));
}

System.out.println("=============================== Name 기준으로 오름차순 정렬 ===============================");
for (int i = 0; i < sortName.size(); i++) {
    System.out.println(sortName.get(i));

}

System.out.println("=============================== Grade 기준으로 내림차순 정렬 ===============================");
for (int i = 0; i < sortGradeDesc.size(); i++) {
    System.out.println(sortGradeDesc.get(i));
}

System.out.println("=============================== Class 기준으로 내림차순 정렬 ===============================");
for (int i = 0; i < sortClassDesc.size(); i++) {
    System.out.println(sortClassDesc.get(i));
}

System.out.println("=============================== Num 기준으로 내림차순 정렬 ===============================");
for (int i = 0; i < sortNumDesc.size(); i++) {
    System.out.println(sortNumDesc.get(i));
}

System.out.println("=============================== Name 기준으로 내림차순 정렬 ===============================");
for (int i = 0; i < sortNameDesc.size(); i++) {
    System.out.println(sortNameDesc.get(i));

}

정렬된 결과를 아래와 같이 확인 할 수 있다.

 

이것으로 JsonArray를 정렬하는 방법에 대해서 알아봤습니다.

 

혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.

오늘도 Jindory 블로그에 방문해주셔서 감사합니다.

 

[ 참조 ]

https://pythonq.com/so/java/173909

반응형