[플러터] 클래스 객체 배열 정렬, 특정 변수로 오름차순, 내림차순 (등수, 나이, 점수, 시간, 날짜별 정렬) Flutter class ArrayList sort rank
플러터 프로젝트를 진행하다가
클래스 배열에 대한 정렬, 즉 내림차순, 오름차순이 필요했는데 j
ava에서는 비슷한게 좀 보였지만 flutter나 dart 언어에서는 아직 자료가 많지 않은 것 같고,
있어도 외국어라 생소해서 힘들게 익힐 수 있었습니다.
가령,
List<Int> numList = [4,2,3,7,1];
이런게 있다면
numList.sort()를 통해
[1,2,3,4,7] 형태로 배열 자체를 오름차순으로 정렬할 수 있습니다.
하지만 변수가 단일객체가 아니라, 클래스 배열이라면??
예를 들어 [선수별 시간 기록] 같은게 있다고 해보겠습니다.
아래와 같이 클래스를 선언합니다.
class MyScore{
String name;
String time;
int score;
String date;
MyScore(this.name, this.time, this.score, this.date);
String toString(){
return '{ ${this.name}, ${this.time}, ${this.score}, ${this.date}}';
}
}
아래와 같이 클래스 배열을 선언하고, 고정값을 대입해줍니다.
List<MyScore> myScore = [];
myScore.add(MyScore('김기덕', '00:00.55', 80, '20-04-02'));
myScore.add(MyScore('최길동', '00:01.33', 30, '21-06-31'));
myScore.add(MyScore('다람쥐', '00:02.33', 40, '22-05-15'));
myScore.add(MyScore('나대리', '00:00.33', 60, '21-03-04'));
자 이제 가장 중요한 sort 함수를 선언하고 결과를 확인해보겠습니다.
myScore.sort((a, b) => a.name.compareTo(b.name));
print(myScore.toString());
I/flutter ( 3092): [{ 김기덕, 00:00:55, 80, 20-04-02}, { 나대리, 00:00:33, 60, 21-03-04},
{ 다람쥐, 00:02:33, 40, 22-05-15}, { 최길동, 00:01:33, 30, 21-06-31}]
name (이름) 기준, 오름차순으로 정렬됐습니다. (김, 나, 다, 최)
반대로 내림차순으로 하고 싶다면, 맨 처음 'a', 'b'의 순서를 바꿔주면 됩니다.
다시 sort 함수를 선언하고 결과를 확인해보겠습니다.
myScore.sort((b, a) => a.name.compareTo(b.name));
print(myScore.toString());
I/flutter ( 3092): [{ 최길동, 00:01:33, 30, 21-06-31}, { 다람쥐, 00:02:33, 40, 22-05-15},
{ 나대리, 00:00:33, 60, 21-03-04}, { 김기덕, 00:00:55, 80, 20-04-02}]
차이가 보이시나요? (최, 다, 나, 김)
같은 방법으로 이번엔 시간순으로 정렬해보겠습니다.
스탑워치 시간 기준이라 '00:01.33' 과 같이 string 인데도
133 같은 자연수처럼 취급되어 정렬이 매끄럽게 잘 됩니다.
* 오름차순
myScore.sort((a, b) => a.time.compareTo(b.time));
print(myScore.toString());
I/flutter ( 3092): [{ 김기덕, 00:00.55, 80, 20-04-02}, { 나대리, 00:00.33, 60, 21-03-04},
{ 최길동, 00:01.33, 30, 21-06-31}, { 다람쥐, 00:02.33, 40, 22-05-15}]
* 내림차순
myScore.sort((b, a) => a.time.compareTo(b.time));
print(myScore.toString());
I/flutter ( 3092): [{ 다람쥐, 00:02.33, 40, 22-05-15},
{ 최길동, 00:01.33, 30, 21-06-31}, { 김기덕, 00:00.55, 80, 20-04-02}, { 나대리, 00:00.33, 60, 21-03-04}]
일반 자연수인 score는 당연히 잘 될테니 패스하고
날짜값 (21-06-31)도 정렬시켜보겠습니다.
* 오름차순
myScore.sort((a, b) => a.date.compareTo(b.date));
print(myScore.toString());
I/flutter ( 3092): [{ 김기덕, 00:00.55, 80, 20-04-02}, { 나대리, 00:00.33, 60, 21-03-04},
{ 최길동, 00:01.33, 30, 21-06-31}, { 다람쥐, 00:02.33, 40, 22-05-15}]
* 내림차순
myScore.sort((b, a) => a.date.compareTo(b.date));
print(myScore.toString());
I/flutter ( 3092): [{ 다람쥐, 00:02.33, 40, 22-05-15}, { 최길동, 00:01.33, 30, 21-06-31},
{ 나대리, 00:00.33, 60, 21-03-04}, { 김기덕, 00:00.55, 80, 20-04-02}]
이렇게 dart 언어로 클래스 객체 배열을 특정 변수로 정렬시키는 방법도 알아봤습니다.