프로젝트 진행중에 배열의 순서를 정리해야하는 상황을 만났다.
배열 순서를 정렬할 때는 여러 상황이 있는데 오늘은 오름차순, 내림차순, 앞뒤비교를 알아보자.
- 우선 오름차순은 가장 간단하다.
Arrays.sort() 함수를 사용하면 된다.
int[] arr = {2, 30, 11, 21, 9, 8, 100};
Arrays.sort(arr);
System.err.println("Sorted arr[] : " + Arrays.toString(arr));
Sorted arr[] : [2, 8, 9, 11, 21, 30, 100];
위와같이 아주 간다하게 정렬을 할 수 있다.
자료형이 String[]이라도 가능하다.
- 다음 내림차순 정렬이다.
내림차순 정렬은
Collections.reverseOrder()
를 sort() 함수에 인자로 전달하면 된다.
Integer[] arr = {2, 30, 11, 21, 9, 8, 100};
Arrays.sort(arr, Collections.reverseOrder());
System.err.println("Sorted arr[] : " + Arrays.toString(arr));
Sorted arr[] : [100, 30, 21, 11, 9, 8, 2];
위에서 주의해야할 것은 오름차순 정렬에서는 배열 arr의 자료형이 int[]로 가능했다.
하지만 내림차순 정렬에서는 Integer[] 자료형으로 바꿔줘야한다.
이유는 Collections.reverseOrder() 함수 때문이다.
위와 같이 사용하면 내림차순 정렬을 할 수 있다.
이것도 물론 String[]도 가능하다.
- 마지막 앞뒤 서로 비교
본인이 프로젝트에서 해야했던 상황이다.
약간의 설명을 붙이자면 본인은 menu라는 model을 만들고 menu안에는 메뉴이름, 메뉴링크, 권한, 메뉴 순서등의 자료가 들어있다.
어떠한 사이트에 메뉴가 10개가 있다고 가정하고
특정 회원이 사이트에 접속했을 시에 10개 메뉴를 모두 나타내지만 권한이 있는 메뉴 우선으로 나타내고 그 다음 권한이 없는 메뉴를 나타내도록 했다.
가정상황)
- menuList는 여러개의 map으로 이루어진 배열이다. - > menuList : [ {}, {}, {} ...]
- menuList 안에 있는 하나의 map이 하나의 menu인 것이다. {menuName: ... , menuLink:..., auth: false...}
- menu 안에 있는 auth는 Boolean 값이다.
코드를 봐보자
menuList.sort((menu1, menu2) -> {
if (menu1.isAuth() && !menu2.isAuth()) {
return -1;
} else if (!menu1.isAuth() && menu2.isAuth()) {
return 1;
} else {
if (menu1.getSort() > menu2.getSort()) {
return 1;
} else {
return -1;
}
}
});
위 코드를 해석하면
먼저 menuList라는 배열 안에 있는 첫번째 map (menu1)과 두번째 map (menu2)를 비교한다.
menu1의 권한(auth)이 true && menu2의 권한(auth) false 라면
return -1;
- > -1을 return 한다는 것은 menu1의 순서가 menu2보다 앞으로 한다는 것이다.
menu1의 권한(auth)이 false && menu2의 권한(auth) true 라면
return 1;
- > 1을 return 한다는 것은 menu1의 순서가 menu2보다 뒤로 한다는 것이다.
다음 둘 다 false 혹은 true일 때는
menu1과 menu2의 기본으로 갖고 있는 sort를 비교한다.
위와 같은 과정을 거치면 menuList 안에 menu들은 각각 갖고있는 권한과 순서를 비교해서
권한이 있는 녀석들이 먼저 나오고 권한이 없는 녀석들은 뒤로 가고 권한이 있는 녀석들은 있는 녀석들 끼리 없는 녀석들은 없는 녀석들 끼리 sort를 비교하여 순서가 정렬된다.
설명하면서도 이해가 어렵다...
코드를 자꾸 몇번이고 봐야겠다...
오늘도 벽을 느낀다...
'Web' 카테고리의 다른 글
JavaMailSender란 녀석을 만났다. (0) | 2023.06.19 |
---|---|
IntelliJ 로컬서버와 실제 운영서버 소스코드 비교/수정/반영(Deployment) (0) | 2023.02.22 |
intelliJ 에서 서버 재시작 없이 jsp 적용하기 (0) | 2022.08.16 |
intelliJ에서 Spring boot 프로젝트 생성하기 (1) | 2022.08.12 |
cmd에서 JAVA 컴파일 및 class파일 실행(라이브러리 함께) (0) | 2022.08.03 |