2024. 5. 27. 03:22ㆍ카테고리 없음
Mysql 같은 DB에선 OrderBY 라는 좋은 정렬기능이있다(desc,asc)등..
Firebase 기반 리듬게임의 랭킹기능을 구현할려던 와중 일단 랭킹컬렉션을 따로 제작하기에 이르렀고.
ranking 컬렉션 -> 곡명 document 안에 유저이름 : 점수 필드가 만들어져있다.
내가 필요한건 이 점수에대한 내림차순, 오름차순 정렬이기에 구현을 해보기로 한다.
일단 이러한 UserScore이란 데이터모델 객체를 하나 만들어준다. 이를 만들어주는 이유는
List의 Collections.sort 메소드를 사용하여 정렬하기 위함인데. 숫자만 정렬되는게 아닌 해당하는 숫자의 유저네임도 같이 정렬돼야하기 때문.
데이터 스냅샷으로 받아온 파이어베이스 데이터를 Map에 담고,
Map데이터를 UserScore객체를 이용해 List에 넣어준다음
Collections.sort로 매개변수로 List와 new Comparator<데이터모델>() 을 넣어주면
디버깅 예시
예시 데이터가 다음과 같다고 가정해봅시다:
- User1: 점수 3000
- User2: 점수 2500
- User3: 점수 4000
이 예제 데이터로 userScores 리스트를 생성합니다.
List<UserScore> userScores = new ArrayList<>();
userScores.add(new UserScore("User1", 3000));
userScores.add(new UserScore("User2", 2500));
userScores.add(new UserScore("User3", 4000));
정렬 전 리스트의 상태는 다음과 같습니다:
- User1: 3000
- User2: 2500
- User3: 4000
정렬 과정
Collections.sort는 리스트를 정렬하기 위해 비교 과정을 거칩니다. Comparator의 compare 메서드가 두 개의 UserScore 객체를 비교할 때마다 어떤 일이 일어나는지 보겠습니다.
- 첫 번째 비교 (User1 vs User2)
- compare 메서드 호출: compare(User1, User2)
- User1.getScore() = 3000
- User2.getScore() = 2500
- 비교 결과: Integer.compare(2500, 3000) = -1
- 결과: User1과 User2의 순서는 변경되지 않습니다.
- 두 번째 비교 (User1 vs User3)
- compare 메서드 호출: compare(User1, User3)
- User1.getScore() = 3000
- User3.getScore() = 4000
- 비교 결과: Integer.compare(4000, 3000) = 1
- 결과: User3가 User1보다 높은 점수를 가졌기 때문에 User1과 User3의 순서가 바뀝니다.
- 세 번째 비교 (User2 vs User3)
- compare 메서드 호출: compare(User2, User3)
- User2.getScore() = 2500
- User3.getScore() = 4000
- 비교 결과: Integer.compare(4000, 2500) = 1
- 결과: User2와 User3의 순서가 바뀝니다.
이 과정을 통해 최종적으로 리스트는 다음과 같이 정렬됩니다:
- User3: 4000
- User1: 3000
- User2: 2500
즉, Comparator의 compare 메서드는 각 UserScore 객체 쌍을 비교하여 점수가 더 높은 객체가 앞에 오도록 정렬을 수행합니다. 이 때 Integer.compare(u2.getScore(), u1.getScore())를 사용하여 내림차순으로 정렬합니다.
-출처 gpt짱짱맨-
이런식으로 List안의 데이터들을 차례로 다 정렬을 해서 반환을 한다더라.
noSQL 기반 데이터베이스를 사용중이라면 알아두면 좋을 소양인거같다. 물론 응용하여 마이쿼리등 일반 데이터베이스에서도 사용할수 있다.(굳이 사용안하고 쿼리문으로 해결하는게 제일 깔끔하긴함)