代码之家  ›  专栏  ›  技术社区  ›  Christian

如何在Dart中过滤Map,使所有值都是唯一的?

  •  -1
  • Christian  · 技术社区  · 3 年前

    我有一个列表,格式如下 {0:"a", 1:"b", 2:"c", 3: "a"} 并想删除双重值,这样我最终会得到 {0:"a", 1:"b", 2:"c"} .我也很适应约会 {1:"b", 2:"c", 3: "a"} 。进行此过滤的最惯用方法是什么?

    0 回复  |  直到 3 年前
        1
  •  2
  •   jamesdlin    3 年前

    package:quiver 提供双向地图( BiMap )这使得添加没有唯一值的元素是错误的。

    或者,过滤重复值的一种简单方法是创建一个单独的 Set 值,并使用它来重建 Map :

    Map<K, V> removeDuplicateValues<K, V>(Map<K, V> map) {
      var valuesSoFar = <V>{};
      return {
        for (var mapEntry in map.entries)
          if (valuesSoFar.add(mapEntry.value)) mapEntry.key: mapEntry.value,
      };
    }
    
    void main() {
      var map = {0: "a", 1: "b", 2: "c", 3: "a"};
      print(removeDuplicateValues(map)); // Prints: {0: a, 1: b, 2: c}
    }
    
        2
  •  1
  •   julemand101    3 年前

    如果要更改现有地图,可以执行以下操作。我把它作为一个扩展方法,但你当然也可以把它作为单独的方法或几行代码:

    extension RemoveDuplicateValuesExtension<K, V> on Map<K, V> {
      void removeDuplicateValues() {
        final valuesSoFar = <V>{};
        this.removeWhere((_, value) => !valuesSoFar.add(value));
      }
    }
    
    void main() {
      final map = {0: "a", 1: "b", 2: "c", 3: "a"}..removeDuplicateValues();
      print(map); // Prints: {0: a, 1: b, 2: c}
    }