【问题标题】:Dart sort a map containing both numeric and alpha keys in descending orderDart 按降序对包含数字键和字母键的映射进行排序
【发布时间】:2023-01-12 00:01:34
【问题描述】:

我有以下地图

Map<String, String> Dictionary = {
    '37': 'thirty-four',
    '94': 'ninety',
    '91': 'ninety-one',
    '22': 'twenty-one',
    '61': 'sixty-one',
    '9': 'nine',
    '3': 'three',
    '8': 'eight',
    '80': 'eighty',
    '81': 'eighty-one',
    'Ninety-eight': '98',
    'nine-hundred': '900'};

我想按升序对它进行排序,这样最终的结果是

3: three
8: eight
9: nine
22: twenty-two
37: thirty-seven
61: sixty-one
80: eighty
81: eighty-one
91: ninety-one
94: ninety four
Ninety-eight': 98
nine-hundred': 900

但是我得到的结果是

22: twenty-two
3: three
37: thirty-seven
61: sixty-one
8: eight
80: eighty
81: eighty-one
9: nine
91: ninety-one
94: ninety-four
Ninety-eight: 98
nine-hundred: 900

以上结果我的代码如下

sortDict(){

    var sortedByKeyMap = Map.fromEntries(
        Dictionary.entries.toList()..sort((e1, e2) => (e1.key).compareTo((e2.key))));

    print(sortedByKeyMap);


  }

关于如何首先将数字字符串键转换为 int 的任何想法?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    一个小技巧可以帮助你,

         var sortedByKeyMap = Map.fromEntries(
            Dictionary.entries.toList()
         ..sort((e1,e2) {
           var key1 = int.tryParse(e1.key);
           var key2 = int.tryParse(e2.key);
           return (key1 != null && key2 != null) ? key1.compareTo(key2) : e1.key.compareTo(e2.key);
         })); 
         
        print(sortedByKeyMap);
    

    输出:

    {
       "3":"three",
       "8":"eight",
       "9":"nine",
       "22":"twenty-one",
       "37":"thirty-four",
       "61":"sixty-one",
       "80":"eighty",
       "81":"eighty-one",
       "91":"ninety-one",
       "94":"ninety",
       "Ninety-eight":98,
       "nine-hundred":900
    }
    

    【讨论】:

    • 绝对是解决方案。如果您不介意,请问 ELI5 您的代码中发生了什么?
    • sort 回调如果只保存 tryParse 的结果而不是对每个字符串解析两次会更好。
    • 此外,如果 tryParse 失败,您要么抛出异常,要么回退到原始字符串比较。无条件返回 -1 意味着将不一致地处理无法解析的条目,从而导致意外结果。
    • @BlackEyedBeans 重要的是你的sort 回调需要调用int.parse(或int.tryParse)在字符串上将它们转换为整数,然后再执行每次比较。
    • @MeshkatShadik 我已经告诉你该怎么做。明确地说,你的回调主体会更好:var key1 = int.tryParse(e1.key); var key2 = int.tryParse(e2.key); return (key1 != null &amp;&amp; key2 != null) ? key1.compareTo(key) : e1.key.compareTo(e2.key);
    猜你喜欢
    • 2015-07-17
    • 2021-12-20
    • 2020-12-10
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多