Дайте список, например
[{id: 4}, {id: 5}, {id: 4}, {id: 7}, {id: 6}, {id: 4}, {id: 5}, {id: 7}]
И дан другой список
[5, 7, 6, 4]
Как отсортировать первый список на основе значений второго?
(то есть получить
[{id: 5}, {id: 5}, {id: 7}, {id: 7}, {id: 6}, {id: 4}, {id: 4}, {id: 4}]
в результате)
Вы можете попробовать что-то вроде этого:
void main() {
List<Map<String, dynamic>> list = [
{"id": 4},
{"id": 5},
{"id": 4},
{"id": 7},
{"id": 6},
{"id": 4},
{"id": 5},
{"id": 7}
];
List<int> orderBy = [5, 7, 6, 4];
List sorted = [];
orderBy.forEach((val) => list
.forEach((ele) => ele.values.first == val ? sorted.add(ele) : ""));
print(sorted);
}
Я собираюсь изменить принятый ответ, так как я использую ответ @jamesdlin, надеюсь, все в порядке
Сначала я бы построил обратную карту, которая сопоставляет значения идентификатора со списками всех записей с этим идентификатором. Оттуда было бы просто просто перебрать второй список, который указывает желаемый порядок, найти записи на обратной карте и соединить результаты:
void main() {
var items = <Map<String, int>>[
{'id': 4},
{'id': 5},
{'id': 4},
{'id': 7},
{'id': 6},
{'id': 4},
{'id': 5},
{'id': 7},
];
var orderBy = [5, 7, 6, 4];
var idToItems = <int, List<Map<String, int>>>{};
for (var item in items) {
(idToItems[item['id']] ??= []).add(item);
}
var sorted = <Map<String, int>>[
for (var id in orderBy)
...idToItems[id],
];
print(sorted);
}
Этот подход немного сложнее, но он должен иметь временную сложность O(m + n) (где m — длина items
, а n — длина orderBy
):
idToItems
) занимает O(m) времени. Для каждого из m элементов items
:
idToItems
, что равно O (1).orderBy
составляет O (n).Спасибо, сир. Сейчас не на моем столе, но я посмотрю и задам вопросы, если они есть. Я очень ценю, что вы нашли время, чтобы опубликовать.
Это красиво и компактно, но не так эффективно, как могло бы быть. Это O(m * n), где m — длина списка для сортировки, а n — длина списка для сортировки. Это может быть достаточно хорошо, но это также может быть сделано за время O(m + n) (за счет большего объема памяти), что может иметь значение, если списки очень большие.