【问题标题】:Dart Map with String key, compare with ignore case带有字符串键的 Dart Map,与忽略大小写进行比较
【发布时间】:2015-01-03 12:00:54
【问题描述】:

如果键是字符串,Dart 中的 Map 类是否可以忽略大小写?

例如。

var map = new Map<String, int>(/*MyComparerThatIgnoresCase*/);
map["MyKey"] = 42;
var shouldBe42 = map["mykey"];

在 C# 中,Dictionary 构造函数采用与上述注释类似的比较器。在 Dart 中执行此操作的规范方法是什么?

【问题讨论】:

标签: dart


【解决方案1】:

Dart 中的地图有一个内部方法来比较键是否相等。据我所知,您不能为默认的Map 类更改此设置。但是,您可以使用非常相似的核心 LinkedHashMap 类,它不仅允许,而且要求您指定密钥相等方法。你可以在https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:collection.LinkedHashMap查看更多关于 LinkedHashMaps 的信息

LinkedHashMap<String, String> map = new LinkedHashMap(
    (a, b) => a.toLowerCase() == b.toLowerCase(),
    (key) => key.toLowerCase().hashCode
);

map['Foo'] = 'bar';
print(map['foo']);   //bar

【讨论】:

  • 如果你执行 new Map() 你实际上得到了一个 LinkedHashMap。这可以在 Map 的工厂构造函数中看到 (factory Map() = LinkedHashMap;)
  • quiver 中有一个函数在忽略大小写的情况下执行等于。当前的实现只是将它们变成小写,但使用它可能比提供你自己的更好。然后代码变为:import 'package:quiver/strings.dart';new LinkedHashMap&lt;String, List&lt;String&gt;&gt;(equals: equalsIgnoreCase, hashCode: (String k) =&gt; k.toLowerCase().hashCode);
  • stackoverflow.com/a/27786241/116891,下面,是更有效的答案(根据CanonicalizedMap本身的文档字符串)。
【解决方案2】:

使用自定义 equals 函数(以及相应的自定义 hashCode 函数)创建 HashMap 的方法是使用 HashMap 构造函数上的可选参数:

new HashMap<String,Whatever>(equals: (a, b) => a.toUpperCase() == b.toUpperCase(),
                             hashCode: (a) => a.toUpperCase().hashCode);

我真的,真的建议找到一种方法,不要在每次操作时都使用 toUpperCase!

【讨论】:

【解决方案3】:

您也可以使用package:collectionCanonicalizedMap 类来执行此操作。此类明确设计为支持具有“规范”版本键的映射,并且比将自定义相等和哈希码方法传递给普通 Map 稍微高效。

【讨论】:

  • 根据其文档字符串,这是首选方法:/// A map whose keys are converted to canonical values of type `C`. /// /// This is useful for using case-insensitive String keys, for example. It's /// more efficient than a [LinkedHashMap] with a custom equality operator /// because it only canonicalizes each key once, rather than doing so for each /// comparison. /// /// By default, `null` is allowed as a key. It can be forbidden via the /// `isValidKey` parameter.
【解决方案4】:

飞镖有一个漂亮的 CaseInsensitiveEquality().equals(String a, String b) 在他们的 import 'package:collection/collection.dart'; 当我将字符串翻译回枚举时,它返回一个布尔值并且对我很有用。您必须在命令行中运行 dart pub add collection 才能安装该软件包。

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多