如何根据Map〈String,double>在flutter中值对其进行排序

vmjh9lq9  于 2023-01-31  发布在  Flutter
关注(0)|答案(2)|浏览(180)

我有一个包含String和double的Map,我想根据其值对此Map进行排序,并且只想取前4个键值对..如下所示

Map<String,dynamic> mymap={
  'A':2000,
  'B':8000,
  'C':300,
  'D':3890,
  'E':8030,
  'F':300,
  'G':900,
};

我想把它转换成

Map<String,dynamic> resultmap={
  'E':8030,
  'B':8000,
  'D':3890,
  'A':2000,
  'Others':1500,
};
insrf1ej

insrf1ej1#

要按值降序排列Map,可以使用类似下面的方法(查看here以获取更多信息)。

var numbers = {'one': 1, 'two': 2, 'three': 3, 'four': 4};
print(numbers); // {one: 1, two: 2, three: 3, four: 4}

final sortedValuesDesc = SplayTreeMap<String, dynamic>.from(
      numbers, (keys1, keys2) => numbers[keys2]!.compareTo(numbers[keys1]!));
print(sortedValuesDesc); // {four: 4, three: 3, two: 2, one: 1}

要得到其余值的总和,有一些不同的选项可供选择。我在Stack Overflow上找到了this approach

final sum = numbers
    .values
    .skip(4)
    .reduce((value, element) => value + element);

剩下的工作是确保求和后的元素被移除,并将上面的和与所需的键沿着添加到Map中。
让我知道这对你是否有效。:-)

mzillmmw

mzillmmw2#

您可以通过几个步骤完成此操作。
首先申报您的Map。

Map<String,dynamic> mymap={
  'A':2000,
  'B':8000,
  'C':300,
  'D':3890,
  'E':8030,
  'F':300,
  'G':900,
  };

然后,使用此代码按降序对声明的Map进行排序。

var sortedList = mymap.entries.toList()..sort((b,a)=>a.value.compareTo(b.value));

然后,创建一个新Map,并将排序后的列表作为条目添加到新Map中。

Map newMap={};
  newMap.addEntries(mapList);

现在,用这个代码求其他数的和。

int otherNumbersSum = newMap.values.skip(4).reduce((value, element) => value + element);

最后,创建一个新的Map,并通过检查条目是三位数还是四位数来添加该Map中的条目,最后将我们在上一步中得到的总和相加。

Map finalMap ={};  
  for(var a in newMap.entries){
    if(a.value>999){
      finalMap[a.key] = a.value;
    }
  }
  finalMap["Others"] = otherNumbersSum;

你会得到这样的结果。

finalMap ={
  'E':8030,
  'B':8000,
  'D':3890,
  'A':2000,
  'Others':1500,
};

希望能有所帮助:)

相关问题