Flutter/Dart - key, value로 Map 정렬

Map(HashMap)을 key 또는 value로 정렬하는 방법을 소개합니다.

1. key로 Map 정렬

아래와 같이 key를 기준으로 오름차순 정렬을 할 수 있습니다.

  • Map.fromEntries()는 Entry로부터 Map을 생성
  • map.entries.toList()..sort(compare)는 Entry 리스트를 compare 함수로 정렬
void main() {

    Map<int, String> map = {5: 'apple', 1: 'kiwi', 3: 'melon', 4: 'orange'};

    Map<int, String> sortedMap = Map.fromEntries(
        map.entries.toList()..sort((e1, e2) => e1.key.compareTo(e2.key)));

    print(sortedMap);
}

Output:

{1: kiwi, 3: melon, 4: orange, 5: apple}

1.1 내림차순 정렬

만약 내림차순으로 정렬하고 싶다면, 위의 코드에서 compare 함수의 비교 순서를 반대로 변경하면 됩니다.

void main() {

    Map<int, String> map = {5: 'apple', 1: 'kiwi', 3: 'melon', 4: 'orange'};

    Map<int, String> sortedMap = Map.fromEntries(
        map.entries.toList()..sort((e1, e2) => e2.key.compareTo(e1.key)));

    print(sortedMap);
}

Output:

{5: apple, 4: orange, 3: melon, 1: kiwi}

2. value로 Map 정렬

아래와 같이 value를 기준으로 오름차순 정렬을 할 수 있습니다.

위의 예제와 비슷하지만, compare 함수에서 value로 정렬 순서를 비교하도록 구현하였습니다.

void main() {

    Map<int, String> map = {5: 'apple', 1: 'kiwi', 3: 'melon', 4: 'orange'};

    Map<int, String> sortedMap = Map.fromEntries(
        map.entries.toList()..sort((e1, e2) => e1.value.compareTo(e2.value)));

    print(sortedMap);
}

Output:

{5: apple, 1: kiwi, 3: melon, 4: orange}

2.1 내림차순 정렬

만약 내림차순으로 정렬하고 싶다면, 위의 코드에서 compare 함수의 비교 순서를 반대로 변경하면 됩니다.

void main() {

    Map<int, String> map = {5: 'apple', 1: 'kiwi', 3: 'melon', 4: 'orange'};

    Map<int, String> sortedMap = Map.fromEntries(
        map.entries.toList()..sort((e1, e2) => e2.value.compareTo(e1.value)));

    print(sortedMap);
}

Output:

{4: orange, 3: melon, 1: kiwi, 5: apple}

3. SplayTreeMap으로 Map 정렬

SplayTreeMap는 key-value를 Map에 추가할 때, 정렬 순서를 유지하면서 저장하는 Map입니다.

SplayTreeMap.from(otherMap, compare)는 otherMap의 요소들을 compare 함수로 정렬된 순서로 Map을 초기화합니다.

key로 Map을 오름차순으로 정렬하려면 아래와 같이 compare 함수를 구현하면 됩니다.

import 'dart:collection';

void main() {

    Map<int, String> map = {5: 'apple', 1: 'kiwi', 3: 'melon', 4: 'orange'};

    Map<int, String> sortedMap =
            SplayTreeMap<int, String>.from(map, (k1, k2) => k1.compareTo(k2));

    print(sortedMap);
}

Output:

{1: kiwi, 3: melon, 4: orange, 5: apple}

value로 Map을 오름차순으로 정렬하려면 아래와 같이 value를 비교하도록 구현하면 됩니다.

import 'dart:collection';

void main() {

    Map<int, String> map = {5: 'apple', 1: 'kiwi', 3: 'melon', 4: 'orange'};

    Map<int, String> sortedMap =
            SplayTreeMap<int, String>.from(map, (k1, k2) => map[k1]!.compareTo(map[k2]!));

    print(sortedMap);
}

Output:

{5: apple, 1: kiwi, 3: melon, 4: orange}
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha