ディクショナリとカスタム クラス
ディクショナリ データ型のメリットの 1 つは、カスタム クラスを含むほぼすべてのデータ型を受け入れられることです。ただし、カスタム クラスの動作がディクショナリとの連携に影響する場合があります。この例では、ディクショナリが想定どおりに動作するように、カスタム クラスの 2 つの主要な関数をオーバーロードする方法を説明します。
ハッシュの等価性
ディクショナリはハッシュ マップです。つまり、キーを uint64 スカラー ハッシュ コードに変換します。各ハッシュ コードは一意のキーを表し、要求された値を迅速に検索するためにルックアップ中に使用されます。MATLAB® では、関数 keyHash を使用してこれらのスカラーが生成されます。この関数は、入力プロパティ情報を使用して uint64 スカラーを生成します。関数 keyMatch を使用して、ハッシュされたキーが等価かどうかを判別できます。ディクショナリを適切に機能させるためには、keyMatch(A,B) が true の場合、keyHash(A) と keyHash(B) が等しくなければなりません。ほとんどのデータ型では、追加の手順なしでこの関係が成り立ちます。ただし、一部のカスタム クラスは、比較対象から除外されるようなプロパティをもつことができます。
たとえば、データを収集し、データ収集時刻を記録するために使用されるクラスを作成するとします。このクラスには dataValue と timestamp の 2 つのプロパティがあります。
classdef myDataClass properties dataValue double = 0 timestamp datetime = datetime end end
データの比較においては、dataValue のみが重要です。ただし、keyHash は、ハッシュ コードの生成時に両方のプロパティを使用します。
カスタム クラスの keyHash と keyMatch のオーバーロード
ディクショナリで myDataClass を意図したとおりに機能させるには、keyHash と keyMatch をオーバーロードします。dataValue プロパティのみを使用してハッシュ値を生成および比較する keyHash メソッドと keyMatch メソッドを、myDataClass に追加します。
classdef myDataClass properties dataValue double = 0 timestamp datetime = datetime end methods function h = keyHash(obj) h = keyHash(obj.dataValue); end function tf = keyMatch(objA,objB) tf = keyMatch(objA.dataValue,objB.dataValue); end end end
参考
dictionary | keyHash | keyMatch