dart 对Map中的Map进行排序并转换为列表中的列表

m3eecexj  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(153)

以下是我在Firebase中的数据:

prices
  price1
    priceAmount1: 10
    priceAmount2: 20
    priceAmount3: 30
  price2
    priceAmount1: 15
    priceAmount2: 5
    priceAmount3: 7
  price3
    priceAmount1: 2
    priceAmount2: 4
    priceAmount3: 6

如果我马上把它找回来。有时排序是price2,price3,price1。所以我试着这样分类:

var sortedKeys = prices!.price!.keys.toList()..sort();
      for (var it = 0; it < sortedKeys.length; it++) {
        print('${sortedKeys[it]}');
      }

但自从它变成了一个列表,我就不能再访问Map了。我想在一个Map中对Map进行排序,然后将其存储在一个列表中的列表中。请帮帮我谢谢你,谢谢
编辑:

final splayByPrice =
    SplayTreeMap<dynamic, dynamic>((a, b) => a.compareTo(b));

List<Map<dynamic, dynamic>> priceAmountMap = [
        {
          'priceAmount1': 10,
          'priceAmount2': 20,
          'priceAmount3': 30,
        },
        {
          'priceAmount1': 15,
          'priceAmount2': 5,
          'priceAmount3': 7,
        },
        {
          'priceAmount1': 2,
          'priceAmount2': 4,
          'priceAmount3': 6,
        }
      ];

      Map<dynamic, Map<dynamic, dynamic>> priceMap = {
        'price2': priceAmountMap[1],
        'price1': priceAmountMap[0],
        'price3': priceAmountMap[2],
      };

      priceMap.forEach((key, value) {
        splayByPrice.addAll(value);
      });

      priceMap.forEach((key, value) {
        print('$key \t $value');
      });

它打印的内容仍然没有排序。

price2   {priceAmount1: 15, priceAmount2: 5, priceAmount3: 7}
price1   {priceAmount1: 10, priceAmount2: 20, priceAmount3: 30}
price3   {priceAmount1: 2, priceAmount2: 4, priceAmount3: 6}
von4xj4u

von4xj4u1#

Dart的默认Map实现是一个LinkedHashMap,它按插入顺序存储条目。
(You我还没有提供清楚地显示数据结构的代码,所以我将使用自己的示例。)
如果你希望Map按键的字母顺序排序,那么你可以:

  • 创建一个新的Map,并按照所需的顺序向其中添加项目:
var theMap = {
  4: 'four',
  7: 'seven',
  6: 'six',
  9: 'nine',
  5: 'five',
  1: 'one',
  8: 'eight',
  0: 'zero',
  3: 'three',
  2: 'two',
};

void main() {
  var sortedKeys = theMap.keys.toList()..sort();
  var sortedMap = {
    for (var key in sortedKeys)
      key: theMap[key]!,
  };
  print(sortedMap);
}

或者,如果您想更新现有的Map,您可以清除现有的Map并将其替换为已排序的条目。(我的dartbag packageLinkedHashMap上提供了一个sort扩展方法来实现这一点。

  • 更新现有的Map,按所需顺序删除和重新添加项目:
void main() {
  var sortedKeys = theMap.keys.toList()..sort();
  for (var key in sortedKeys) {
    var value = theMap[key]!;
    theMap.remove(key);
    theMap[key] = value;
  }
  print(theMap);
}
  • 使用SplayTreeMap,它按比较规则对条目进行排序。
import 'dart:collection'; 

void main() {
  var splayTreeMap = SplayTreeMap.of(theMap);
  print(splayTreeMap);
}

如果只需要对数据进行一次排序,我会使用前两种方法中的一种。如果您经常添加新条目,那么我会使用SplayTreeMap而不是Map/LinkedHashMap,以便条目以排序顺序保存。(但请注意,SplayTreeMap中的查找,插入和删除是O(log n)而不是O(1)。
if you're sorting strings that contain numbers, you probably don't want to use the normal string sort

相关问题