問題タブ [tdictionary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - TDictionary - 無効なキー
次のようなコードがあります。
ランダムに、「v := myDict.Items[k];」でスローされる例外が表示されます。これは、k が無効であることを示しています。
他の誰かがこれを見ましたか?
delphi - Delphi 2009 で TDictionary をキーのアルファベット順にリストするにはどうすればよいですか?
TEnumerator を使用して TDictionary をキー順に並べ替えるにはどうすればよいですか?
私はこのようなものを持っています:
したがって、辞書を次の順序で処理したいと思います: ダム、アーリー、ヘルプミー、タイテッド。
残念ながら、Delphi のヘルプでは、一般的な列挙子と TEnumerator が具体的にどのように機能するかについての説明が非常に少なく、私が見つけることができる例はありません。また、Delphi でジェネリックを使用して列挙子を使用する方法については、ウェブ上でほとんど書かれていません。
また、上記のサンプル コードは TEnumerator を使用していないため、これがどのように使用されるように設計されているかについて混乱しています。
バリー、答えてくれてありがとう。
質問をしてからのジェネリックへの冒険は興味深いものでした。私は自分のコードにそれらを実装したいと思っていました。ジェネリックにはソートを処理するメソッドが組み込まれているように見えるため、「ソート」の問題はやや困惑していましたが、それを行う方法に関する良い例やドキュメントはありません。
最後に、Barry が提案したことを実行し、外部インデックスを Dictionary に組み込みました。それでも、それは正しくありません。
ただし、別の驚きがありました。 Gabr の GPStringHash を Generic の TDictionary に置き換えようとしていたのです。コードは、ジェネリックによって少しきれいになりました。しかし、結論としては、TDictionary は Gabr の 3 倍以上遅いということでした。TryGetValue への 1,704,667 回の呼び出しには 0.45 秒かかりましたが、Gabr のルーチンに対する同じ操作には 0.12 秒かかりました。理由はわかりませんが、Gabr がより高速なハッシュ関数とバケットの組み合わせを持っているのと同じくらい単純かもしれません。あるいは、すべてのケースに対してジェネリックを一般化する必要があり、それが本質的に速度を低下させているのかもしれません。
それでも、Barry や他の Delphi 開発者はこれを検討する必要があります。個人的には、選択肢があれば、サードパーティのパッケージ (Gabr と同じくらい良いものでも) よりも、言語に組み込まれているものを使用する方が早いでしょう。しかし、今のところ、GPStringHash に固執します。
delphi - Delphi TDictionary で、Value オブジェクトが null として挿入されます
Delphi 9 の TDictionary ジェネリック クラスを使用しています。私の TDictionary は次のようになります。
そして、次のように TDictionary を初期化します。
TList も初期化しているので、それを使用して TDictionary を設定できます。TList/TDictionary に入力するために使用するファイル データをループしています。同じ TList を再利用して、値として TDictionary に挿入しようとしています。TDictionary への最初の挿入では、項目の TList 値が存在し、その中にデータが含まれています。2 回目以降の反復では、TList 値はすべて nil です。
このすべてを参照によって行っているように思えます。TList を参照ではなく値で TDictionary に追加するにはどうすればよいですか?
delphi - TDictionaryからキーを取得する方法は?
私は持っていTDictionary<TKeyClass, TValueClass>
ます。
私は次のようなことを達成したい
キーにアクセスできなくなりました。キーを正確に知っていれば、キーを使用できます。
唯一の選択肢は作成しTDictionary<TValueClass, TKeyValue>
ますか?だから私はキーを通してループすることができますか?
私が見つけたworkaroudは作成することですTList<TKeyClass>
が、これは私が好きではないものです。
performance - TDictionary のデフォルトの IEqualityComparer?
読んだだけ
「IEqualityComparer インターフェイスを実装するすべてのクラスは、Equalsメソッドの実装を提供することが期待されています。」- ( Delphi DocWiki )
と
「IEqualityComparer インターフェイスを実装するすべてのクラスは、GetHashCodeメソッドの実装を提供することが期待されています。」- ( Delphi DocWiki )
TDictionary を作成して IEqualityComparer を実装しない場合、TDictionary のパフォーマンスはどうなりますTDictionary<TObject, TObject>
か?
デフォルトの実装が見つかりませんでした (Delphi 2009)。では、それらのキーのハッシュ コードはどのように計算されるのでしょうか。
それが単に Dictionary エントリ キー内のオブジェクトのメモリ アドレスである場合、特定のエントリの検索は順番に実行されますか?
delphi - TDictionary の Equals と GetHashCode
TDictionary を使用して Delphi で関係 Car <-> Owner を実装する場合、IEqualityComparer の Equals および GetHashCode 関数をどのように実装すればよいですか? (GetHashCode は、TDictionary でのハッシュに使用される整数を返します。)
TVehicle クラスの場合、VIN (車両識別番号) があると仮定します。
VIN のハッシュコードはどのように実装すればよいですか?
更新: この例では、オブジェクト ID は「2 つのオブジェクト ポインターのメモリ位置の ID」を意味するのではなく、「プロパティの一意で不変 ("不変") な組み合わせに基づく、同じオブジェクトの 2 つのインスタンスの ID」を意味します。 .
したがって、マップ内のメモリ アドレスで車両を検索する代わりに、探している ID を持つ車両が必要です。
アプリケーションの起動時にディクショナリにロードされる車両所有者データを含むデータベースを考えてみてください。ユーザーがアプリケーション フォームに VIN を入力した場合、アプリケーションはどのようにして辞書で車両を見つけることができるのでしょうか? コードがVehicleFactory.CreateVehicleFromDatabase(Edit1.Text);
このオブジェクトを使用して新しいインスタンスを作成し、辞書で検索する場合、Equals の既定の実装では、メモリ アドレスを検索するため、マップ内のエントリが見つかりません。車両を見つけるために、Equals は VIN を比較する必要があります。
したがって、カスタム IEqualityComparer を作成する必要があります。Equals の実装は簡単です。しかし、GetHashCode はどうでしょうか。文字列プロパティの場合、文字列のアドレスを単純に使用することはできません ( Delphi 文字列は不変ですか?の Berry Kelly を参照してください:「コードの 2 つの別々のセクションから同じ文字列を作成すると、同じバッキング ストアを共有しません」)。であるため、文字列プロパティの GetHashCode 関数にはカスタマイズされた実装が必要です。
Delphi で文字列をハッシュするにはどうすればよいですか? という質問も見つけました。- を含む例がありますHashValue('Hello World')
delphi - デルファイ辞書の反復
おはよう!
辞書TDictionary<String, TStringlist>
(delphi-collections-unit)に値として文字列を入力し、値としていくつかの文字列を入力します。何かのようなもの:
- 名前=ジョン、リサ、スタン
- スキル=読む、書く、話す
- 年齢=12、14、16
(もちろん「、」なし)。私が必要としているのは、この辞書を繰り返し、値にキーを掛けることです。出力は次のようになります
- 名前=ジョンスキル=読み取り年齢=12
- 名前=ジョンスキル=読み取り年齢=14
- 名前=ジョンスキル=読み取り年齢=16
- 名前=ジョンスキル=書き込み年齢=12
- 名前=ジョンスキル=書き込み年齢=14
- 名前=ジョンスキル=書き込み年齢=16
- ..。
- 名前=リサスキル=読み取り年齢=12
- ..。
- 名前=スタンスキル=話す年齢=16
だからすべての組み合わせ。どうすればいいですか?キーの数は動的であり、tstringlistのサイズも動的です。ありがとう!今までに解決...
今スコープの問題。以下は、口述を満たす手順です。サブスプリットとスプリットストリングはストリングリストであり、プロシージャの最後に解放されます。dictはprocedures-block(主に?どのように呼び出されますか?)の後に作成され、fill-methodが呼び出され、コード例のように再帰を実行したいのですが、dictに値がありません... 。
delphi - デルファイ変数のスコープの質問
キーと値のペアを反復処理するために、ファイルから読み取った tdictionary に入力します。反復はDelphi 辞書反復で解決されました。
問題は、辞書の値が保持されないことです。おそらく、変数のスコープの問題です。私はJavaに慣れています...値は、プロシージャparsetextfileで辞書に割り当てた直後に存在し、その後失われます:
delphi - TDictionary から派生したクラスのカスタム列挙子を作成する方法は?
TDictionary から派生したコレクションを定義しましたが、追加のフィルターを適用するカスタム列挙子を定義する必要があります。
TDictionary FItems 配列 (非公開) にアクセスできないため、MoveNext メソッドを定義できません。
TDictionary から派生したクラスでフィルター処理された列挙子をどのように再定義しますか?
私がやりたいことを説明するための簡単なコードは次のとおりです。
delphi - TDictionary コンテンツを別のコンテンツにコピーする簡単な方法はありますか?
ある TDictionary コンテンツを別のコンテンツにコピーする単一の方法または簡単な方法はありますか? 次の宣言があるとしましょう
ソースをターゲットに 1:1 でコピーしたいと思います。これにはそのような方法はありますか?
ありがとう!