2015-01-03 14 views
6

DartのMapクラスは、キーが文字列の場合に大文字小文字を無視する方法がありますか?Dart Map with String key、ignore caseと比較する

例:

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

C#では、Dictionaryコンストラクタは上記のコメントのような比較器を使用します。ダーツでこれを行う正規の方法は何ですか?

答えて

4

マップが等しいかどうかの鍵を比較する内部メソッドを持っています。私の知る限りでは、デフォルトのMapクラスのためにこれを変更することはできません。ただし、非常によく似たコアのLinkedHashMapクラスを使用することができます。これは、許可するだけでなく、キーの等価メソッドを指定する必要があります。あなたはHashMapコンストラクタにオプションのパラメータを使用することですカスタムでHashMapを作成する方法は、関数(および対応するカスタムのhashCode機能)に等しいhttps://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:collection.LinkedHashMap

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

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

新しいマップ()を実行すると、実際にLinkedHashMapが取得されます。これはMapの工場コンストラクタで見ることができます(工場地図()= LinkedHashMap ;) –

+0

大文字小文字を無視している間、equiverを行う関数があります。現在の実装では、それらを小文字にするだけですが、独自のものを提供するよりも使用するほうがよいでしょう。この場合、コードは次のようになります。 'import 'パッケージ:quiver/strings.dart';' 'new LinkedHashMap >(等しい:equalsIgnoreCase、hashCode:(String k)=> k.toLowerCase()。hashCode) ; ' –

0

Dictionaryを使用できます。
これはDartで標準的な方法ではありません。

import "package:queries/collections.dart"; 

void main() { 
    var dict = new Dictionary<String, int>(new IgnoreCaseComparer()); 
    dict["MyKey"] = 42; 
    var shouldBe42 = dict["mykey"]; 
    print(shouldBe42); 
} 

class IgnoreCaseComparer implements IEqualityComparer { 
    bool equals(Object a, Object b) { 
    if (a is String && b is String) { 
     return a.toLowerCase() == b.toLowerCase(); 
    } 

    return a == b; 
    } 

    int getHashCode(Object object) { 
    if (object is String) { 
     return object.toLowerCase().hashCode; 
    } 

    return object.hashCode; 
    } 
} 

出力ダートで

42 
4

でLinkedHashMapsについての詳細を確認することができます。

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

私は本当に、すべての操作でtoUpperCaseを実行しない方法を見つけることをお勧めします!

+0

これは正解ですが、LinkedHashMapはマップ用に取得するデフォルトの実装です。 HashMapのドキュメントはこちらhttps://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:collection.HashMap –

0

package:collectionCanonicalizedMapクラスを使用してこれを行うこともできます。このクラスは、キーの「標準」バージョンのマップをサポートするよう明示的に設計されています。カスタム等価とハッシュコードメソッドを通常のMapに渡すよりもやや効率的です。

関連する問題