반응형
안녕하세요. 개발자 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 메서드는 아래와 같이 동작한다.
- 전달받은 jsonArray list 데이터를 jsonValue에 임시 저장한다.
- Collections sort 메서드는 전달받은 객체를 정렬하는 메서드로써, 단일 자료형일경우 리스트 객체의 값을 비교하며 정렬하지만, Class 객체일 경우 어떤 멤버변수를 기준으로 정렬해야하는지 판단할 수 없기 때문에 Comparator를 통해 정렬 기준을 정의해줘야 한다.
- compare라는 메서드롤 통해 객체 비교 후 반환할 값을 정의한다.
- 먼저 비교할 값(item)을 valA와 valB에 저장한다.
- 가져 올 객체가 문자일 경우 valA와 valB에만 저장한다.
- 가져 올 객체가 숫자일 경우 A와 B에 저장한다.
- 비교할때 문자열과 숫자일 경우를 나눠서 반환값을 정한다.
- 숫자일 경우 A가 B보다 클 경우
- 순방향 1 반환
- 역방향 -1 반환
- 같을경우 0 반환
- 문자열 경우 valA가 valB보다 사전순으로 앞서면 양수, valA와 valB가 사전순으로 같으면 0, 사전순으로 뒤에 있으면 음수 반환
- 순방향일경우 양수반환
- 역방향일경우 음수반환
- 숫자일 경우 A가 B보다 클 경우
- 먼저 비교할 값(item)을 valA와 valB에 저장한다.
위 과정을 통해 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 블로그에 방문해주셔서 감사합니다.
[ 참조 ]
반응형
'개발 > Java' 카테고리의 다른 글
[Java] POI로 데이터 엑셀 다운받기 (0) | 2022.03.22 |
---|---|
[Java] Java 나누기 사용시 주의사항 (0) | 2022.03.09 |
[Java] SMTP와 Mail 발송 (0) | 2022.03.06 |
[Java] 자료형간의 형변환(문자형,정수형,실수형) (0) | 2022.03.03 |
[Java] Stream 활용하기[최종연산] (0) | 2022.02.25 |