카테고리 없음

[플러터] 클래스 객체 배열 정렬, 특정 변수로 오름차순, 내림차순 (등수, 나이, 점수, 시간, 날짜별 정렬) Flutter class ArrayList sort rank

투자퀸 2022. 6. 28. 23:58

플러터 프로젝트를 진행하다가

클래스 배열에 대한 정렬, 즉 내림차순, 오름차순이 필요했는데 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 언어로 클래스 객체 배열을 특정 변수로 정렬시키는 방법도 알아봤습니다.