2015-04-14 2 views
3

Может кто-нибудь дать мне подсказку? Я хочу сортировать значения карты по длине списков.Как сортировать значения карты?

var chordtypes = { 
    "maj": [0, 4, 7], 
    "M7": [0, 4, 7, 11], 
    "m7": [0, 3, 7, 10], 
    "6": [0, 4, 7, 9], 
    "9": [0, 4, 7, 10, 14], 
    "sus2": [0, 2, 7], 
    "sus4": [0, 5, 7], 
    "omit3": [0, 7], 
    "#5": [0, 4, 8], 
    "+7b9#11": [0, 4, 8, 10, 13, 18], 
    "+9": [0, 4, 8, 10, 14] 
}; 
+0

Итак, вы хотите быть «+ 7b9 # 11», чтобы быть первым элементом? Я вряд ли думаю, что это возможно с необработанной картой в Дарт. – Robert

ответ

4

функция, которая делает своего рода карта Список по их длине.

import 'dart:collection'; 

/// sorts the ListMap (== A Map of List<V>) on the length 
/// of the List values. 
LinkedHashMap sortListMap(LinkedHashMap map) { 
    List mapKeys = map.keys.toList(growable : false); 
    mapKeys.sort((k1, k2) => map[k1].length - map[k2].length); 
    LinkedHashMap resMap = new LinkedHashMap(); 
    mapKeys.forEach((k1) { resMap[k1] = map[k1] ; }) ;   
    return resMap; 
} 

результат для:

var res = sortListMap(chordtypes); 
print(res); 

==>

{ omit3: [0, 7], 
    maj: [0, 4, 7], 
    sus2: [0, 2, 7], 
    sus4: [0, 5, 7], 
    #5: [0, 4, 8], 
    M7: [0, 4, 7, 11], 
    m7: [0, 3, 7, 10], 
    6: [0, 4, 7, 9], 
    9: [0, 4, 7, 10, 14], 
    +9: [0, 4, 8, 10, 14], 
    +7b9#11: [0, 4, 8, 10, 13, 18] } 
+1

Лучше использовать 'LinkedHashMap' для' resMap 'потому что он гарантирует, что он выполняет итерации ключей в порядке ввода. –

+1

@ GünterZöchbauer: Я бы поспорил, что реализация по умолчанию также выполняет итерацию в порядке вставки, но гораздо лучше, чем ставка ... я обновил свой ответ! Благодарю. – GameAlchemist

+2

Второй, хотя: Javascript - это грязный язык. С Dart мы можем строить чистые решения, поэтому мы должны. Я обновил, чтобы использовать только LinkedHashMap, и @marcus должен использовать это также, так как порядок его карты имеет значение. Еще раз спасибо. – GameAlchemist

3

Что-то подобное может работать для вас:

Map chordtypes = { 
    "maj": [0, 4, 7], 
    "M7": [0, 4, 7, 11], 
    "m7": [0, 3, 7, 10], 
    "6": [0, 4, 7, 9], 
    "9": [0, 4, 7, 10, 14], 
    "sus2": [0, 2, 7], 
    "sus4": [0, 5, 7], 
    "omit3": [0, 7], 
    "#5": [0, 4, 8], 
    "+7b9#11": [0, 4, 8, 10, 13, 18], 
    "+9": [0, 4, 8, 10, 14] 
}; 

List keys = chordtypes.keys.toList(); 
keys.sort((k1, k2) { 
    if(chordtypes[k1].length > chordtypes[k2].length) 
    return -1; 
    if(chordtypes[k1].length < chordtypes[k2].length) 
    return 1; 
    return 0; 
}); 
keys.forEach((String k) { 
    print('$k ${chordtypes[k]}'); 
}); 
+7

функция сортировки (k1, k2) => (chordtypes [k1] .length - chordtypes [k2] .length) будет делать то же самое, только короче ;-) – GameAlchemist

1
import "package:queries/collections.dart"; 

void main() { 
    var chordtypes = { 
    "maj": [0, 4, 7], 
    "M7": [0, 4, 7, 11], 
    "m7": [0, 3, 7, 10], 
    "6": [0, 4, 7, 9], 
    "9": [0, 4, 7, 10, 14], 
    "sus2": [0, 2, 7], 
    "sus4": [0, 5, 7], 
    "omit3": [0, 7], 
    "#5": [0, 4, 8], 
    "+7b9#11": [0, 4, 8, 10, 13, 18], 
    "+9": [0, 4, 8, 10, 14] 
    }; 

    var dict = new Dictionary<String, List>.fromMap(chordtypes); 
    // Sort by list length, then by key 
    var sorted = dict 
     .orderBy((kv) => kv.value, (a, b) => b.length.compareTo(a.length)) 
     .thenBy((kv) => kv.key, (a, b) => a.compareTo(b)); 
    dict = sorted.toDictionary((kv) => kv.key, (kv) => kv.value); 
    for (var kv in dict) { 
    print("$kv"); 
    } 
} 

Сортировано [listLength, ключ]

+7b9#11 : [0, 4, 8, 10, 13, 18] 
+9 : [0, 4, 8, 10, 14] 
9 : [0, 4, 7, 10, 14] 
6 : [0, 4, 7, 9] 
M7 : [0, 4, 7, 11] 
m7 : [0, 3, 7, 10] 
#5 : [0, 4, 8] 
maj : [0, 4, 7] 
sus2 : [0, 2, 7] 
sus4 : [0, 5, 7] 
omit3 : [0, 7] 
Смежные вопросы