【问题标题】:search in maps dart2 , same as list.indexOf?在地图 dart2 中搜索,与 list.indexOf 相同?
【发布时间】:2018-11-13 07:08:23
【问题描述】:

我使用此示例在 Map 中进行搜索,但不起作用:|:

  var xmenList = ['4','xmen','4xmen','test'];
  var xmenObj = {
  'first': '4',
  'second': 'xmen',
  'fifth': '4xmen',
   'author': 'test'
  };

  print(xmenList.indexOf('4xmen')); // 2
  print(xmenObj.indexOf('4xmen')); // ?

但我在最后一行代码中有错误TypeError: xmenObj.indexOf$1 is not a function

请帮助我在 ma​​p 对象中搜索,方法与 indexOf 相同。

【问题讨论】:

    标签: dart dart-2


    【解决方案1】:

    我找到了答案:

     print(xmenObj.values.toList().indexOf('4xmen')); // 2
    

    或者这个:

      var ind = xmenObj.values.toList().indexOf('4xmen') ;
      print(xmenObj.keys.toList()[ind]); // fifth
    

    【讨论】:

    • 你不能假设键和值的顺序是一样的。在您的第二个示例中,如果 xmenObj.keys.toList()[ind] 返回正确的密钥,那只能靠运气了。
    • @GünterZöchbauer 运气好?你在跟我开玩笑吗 ?但这个答案适合我的工作:)
    • 是的,纯属运气。您的解决方案基于一个不能保证为真的假设。
    • 实际上,Dart HashMapLinkedHashMap 确实承诺迭代值等同于迭代键并查找相应的值。只要地图在迭代之间不改变,我们也保证迭代顺序是稳定的。显然,这只是我们可以保证的平台图书馆地图,但一般建议这样做。
    【解决方案2】:

    地图不能被整数索引,所以没有对应indexOf的操作。如果您将列表视为专用映射,其中键始终是连续整数,则相应的操作应该找到给定值的 。 映射不是为此而构建的,因此遍历所有键和值是获得该结果的唯一方法。 我会这样做:

    K keyForValue<K, V>(Map<K, V> map, V value) {
      for (var entry in map.entries) {
        if (entry.value == value) return key;
      }
      return null;
    }
    

    entries getter 是在 Dart 2 中引入的。如果你没有,那么使用map.values.toList().indexOf(value) 获取迭代位置,然后使用map.keys.elementAt(thatIndex) 获取对应的键。

    如果你真的只想要数字索引,那么你可以跳过最后一步。 它的效率并不高(您分配一个新列表并复制所有值)。另一种方法是:

    int indexOfValue<V>(Map<Object, V> map, V value) {
      int i = 0;
      for (var mapValue in map.values) {
        if (mapValue == value) return i;
        i++;
      }
      return -1;
    }
    

    【讨论】:

    • 太复杂了,我需要简单的方法,我找到了。
    【解决方案3】:

    如果您想找到所有匹配项,您可以使用.where(...) 进行搜索,如果您认为只有一个匹配项,或者您只想要第一个匹配项,则可以使用firstWhere 进行搜索

    var found = xmenObj.keys.firstWhere(
        (k) => xmenObj[k] == '4xmen', orElse: () => null);
    print(xmenObj[found]);
    

    【讨论】:

    • 你错了,它不简单:|,我只是说需要简单的方法而不是复杂的方法。
    猜你喜欢
    • 2012-02-25
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多