問題タブ [tstringlist]
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 - DelphiでTStringListを別の方法でソートするにはどうすればよいですか
私は単純な TStringList を持っています。私はそれに TStringList.Sort を実行します。
次に、アンダースコア「_」が大文字の「A」の前にソートされることに気付きました。これは、同じテキストをソートし、A の後に _ をソートするサード パーティのパッケージとは対照的でした。
ANSI 文字セットによると、AZ は文字 65 ~ 90 で、_ は 95 です。したがって、サードパーティ パッケージはその順序を使用しているように見えますが、TStringList.Sort は使用していません。
TStringList.Sort の中身を掘り下げたところ、AnsiCompareStr (大文字と小文字を区別) または AnsiCompareText (大文字と小文字を区別しない) を使用して並べ替えています。StringList の CaseSensitive 値を true に設定してから false に設定して、両方の方法で試しました。ただし、どちらの場合も、「_」が最初にソートされます。
これが TStringList のバグだとは思えません。ですから、私が見ていない何かがここにあるに違いありません。それは何でしょうか?
本当に知っておく必要があるのは、TStringList を他のパッケージと同じ順序になるように並べ替えるにはどうすればよいかということです。
参考までに、私は Delphi 2009 を使用しており、プログラムで Unicode 文字列を使用しています。
したがって、ここでの最終的な答えは、次のように、Ansi 比較を必要なもの (たとえば、非 ansi 比較) でオーバーライドすることです。
delphi - 文字列リストの並べ替え: アイテムのみを移動または交換する
Delphi/Pascal では、TStringList をアルファベット順にソートしたいと考えています。しかし、この目的のためには、次の 2 つの方法しか使用できません。
Move:文字列をあるインデックス位置から別のインデックス位置に移動し、必要に応じて他の文字列をシフトします。
Exchange:リスト内の 2 つの文字列を、インデックス位置で識別して交換します。
どうすればこれを行うことができますか? 私はループですべてのアイテムを調べて、次のようなものにするという考えを持っていました:
- lastFirstLetter := コピー(CurrentItem, 1, 1)
- 次の項目に移動
- currentFirstLetter := Copy(CurrentItem, 1, 1)
- if ord(currentFirstLetter) < ord(lastFirstLetter) then exchange(lastItem, currentItem)
これら 2 つの方法で StringList をソートする最速の方法は何でしょうか? ちなみに、sort メソッドと sorted プロパティは使用できません。
windows - Unicodeファイル名の比較と並べ替え
UnicodeユーティリティおよびインターフェイスにDelphi2007およびTMSコンポーネントを使用する(UnicodeサポートのためにDelphi 2009にアップグレードすることはオプションではありません)。
ファイル名のリストを文字列リスト(TTntStringList)に保存しています。ソートされ、大文字と小文字は区別されません。デフォルトのソートルーチンは、CompareStringW(LOCALE_USER_DEFAULT、NORM_IGNORECASE、...)を使用して文字列を比較します(検索でも同じです)。ただし、これは、dummyss.txtとdummyß.txt(たとえば)を同一視するため問題ですが、NTFSでは、これら2つのファイルを同じフォルダに置くことは完全に合法です。つまり、これらは異なる名前として扱われます。
私の理解では、Vista以降では、ファイル名を比較する正しい方法はCompareStringOrdinalを使用することです。これは正しいです?
ビスタ以前のシステムでは、正しい方法は何でしょうか?CompareStringW(LOCALE_INVARIANT、...)である必要があると思いますが、完全にはわかりません。
ありがとう
delphi - DelphiのTStringList、動的配列またはリンクリスト?
私には選択肢があります。
保存してアクセスする必要がある、既に注文された文字列が多数あります。以下を使用して選択できるようです:
TStringList
文字列の動的配列、および
文字列のリンク リスト (単方向リンク)
アランはコメントで、私も選択肢に追加することを提案しました。
TList<string>
これらのそれぞれが他のものよりも優れているのはどのような状況ですか?
小さなリスト (10 項目未満) に最適なのはどれですか?
大規模なリスト (1000 項目以上) に最適なのはどれですか?
巨大なリスト (1,000,000 アイテム以上) に最適なのはどれですか?
メモリ使用量を最小限に抑えるにはどれが最適ですか?
最後に余分なアイテムを追加するために読み込み時間を最小限に抑えるのに最適なのはどれですか?
最初から最後までリスト全体にアクセスするためのアクセス時間を最小限に抑えるには、どれが最適ですか?
これに基づいて(または他のものに基づいて)、どのデータ構造が望ましいでしょうか?
参考までに、私は Delphi 2009 を使用しています。
コメントでディミトリーは次のように述べています。
タスクとデータ アクセス パターンを説明すると、正確な回答を得ることができます
わかった。大量のデータを含む家系図プログラムがあります。
人ごとに、いくつかのイベントと属性があります。私はそれらを短いテキスト文字列として保存していますが、0 から数百までの範囲で、1 人あたり多数あります。そして、私は何千人もの人々を持っています。それらへのランダムアクセスは必要ありません。各人物に関連付けられた既知の順序で多数の文字列として関連付けられている必要があるだけです。これは、何千もの「小さなリスト」の私の場合です。それらはロードしてメモリを使用するのに時間がかかり、すべてが必要な場合 (たとえば、生成されたレポート全体をエクスポートするなど) にアクセスするのに時間がかかります。
次に、数十万の名前を持つことができる「仮想」ツリービューのセクションのすべての名前など、いくつかの大きなリストがあります。ここでも、インデックスでアクセスできるリストのみが必要です。これらは効率のためにツリービューとは別に保存され、ツリービューは必要な場合にのみそれらを取得します。これは読み込みに時間がかかり、私のプログラムにとってはメモリに関して非常にコストがかかります。しかし、一度にアクセスされるのはごくわずかなので、アクセス時間を気にする必要はありません。
うまくいけば、これで私が達成しようとしていることのアイデアが得られます。
ps Delphi の最適化に関する多くの質問を StackOverflow に投稿しました。私のプログラムは 100,000 人の 25 MB のファイルを読み取り、8 秒でデータ構造、レポート、およびツリービューを作成しますが、そのために 175 MB の RAM を使用します。32 ビット Windows で数百万人のファイルをロードすることを目指しているため、これを削減するために取り組んでいます。
この StackOverflow の質問で、TList を最適化するためのいくつかの優れた提案を見つけました。 より高速な TList 実装はありますか?
delphi - TStringList.CommaText を取得してコンマを引用符でエスケープしないようにする方法はありますか?
私はコード生成でいくつかの作業を行っています。私がする必要があることの 1 つは、次のように、パラメーターの 1 つが関数呼び出しである関数呼び出しを作成することです。
TStringList.CommaText はパラメータ リストの生成に非常に役立ちますが、ツリーをたどって外部関数呼び出しを作成すると、最終的に次のようになります。
3 番目の引数にカンマが含まれており、無効なコードが生成されたため、引用しています。しかし、関数の引数が内部に二重引用符を含む文字列になる可能性が十分にあるため、StringReplace all double quotes with empty strings のような単純なことはできません。コンマを含む行をエスケープしないようにする方法はありますか?
delphi - TStringListへの区切り文字を使用して文字列を解析すると、スペースでも解析されるようです(Delphi)
いくつかの文字で区切られた単純な文字列があります。たとえば、コンマです。TStringListを作成し、その区切り文字をコンマに設定してから、DelimitedTextを解析するテキストに設定すると、自動的に解析されるはずです。
問題は、出力を見ると、区切り文字としてスペースが含まれていて、結果が途切れるということです。どうすればこれを回避できますか、またはこれを行うためのより良い方法があります。
delphi - オンザフライ圧縮を実装する Delphi TStringList ラッパー
多くの文字列を TStringList に格納するためのアプリケーションがあります。文字列は互いにほとんど同じであり、それらをその場で圧縮することができると思います。つまり、特定の文字列を、一意のテキストフラグメントと以前に保存されたフラグメントへの参照の混合物として保存します。完全修飾パスとファイル名のリストなどの StringList は、大幅に圧縮できるはずです。
これを実装するTStringlistの子孫を知っている人はいますか?
各アクセスの前に文字列リスト全体を解凍し、後で再圧縮することでこれを実装できますが、不必要に遅くなります。私は、インクリメンタル操作とランダムな「シーク」と読み取りに効率的なものを求めています。
ティア・ロス
delphi - 文字列として区切り文字を含む文字列リスト?
文字列として保存されているオブジェクトにHistoryTextという属性があります。グリッド内のすべての行を表示したい。グリッド内の行を削除および編集できるはずです。形式は次のとおりです。
したがって、各行には、日付、時刻、ユーザー、およびメッセージの4つのフィールドがあり、区切り文字列は「-$-」です。文字ではなく文字列を区切り文字として、stringlists区切り文字プロパティに割り当てることはできません。
文字列を文字列リストに抽出するルーチンがあります。
そしてそれはうまくいくようです。私の問題は、StringListの変更を元のStringプロパティに同期することです。この区切り文字には非常に多くの履歴データがあるため、TCharに変更することは現実的なオプションではないと思います。
更新: 説明。上記の方法で文字列を文字列リストに変換できると思います。次に、グリッドに表示するのはそれほど難しくないはずです。問題は、区切り文字として'-$-'を使用してTStringListを元のStringプロパティに変換し直すときに発生します。たとえば、HistoryText:=myStringList.Delimitedtextを実行できません。
2番目の更新: 私はそれを解決しました。あなたは皆、速い答えと本当に助けようとしているために+1を得ました。要約すると、私はそれをどのようにしたか。
Historytextから読む:
これで、各行に「-$-」の3つの区切り文字があり、各行は通常どおり改行で区切られます。
- ループで文字列リストを解析し、グリッドに表示します。MyStringListについてはもう気にしません。
- ユーザーがグリッド内の行を削除および編集できるようにします。
- グリッド内の行と列でループが終了したら、元の文字列と同じ形式で新しい文字列を作成します。
- その文字列をHistoryTextに割り当てます。
したがって、フォーカスをStringListからグリッドにシフトすると、簡単になります:)
delphi - Delphi TStringListで名前と値のペアをすばやく検索するにはどうすればよいですか?
実行時にすべての文字列をTStringListに入れて、アプリケーションに言語翻訳を実装しました。
次に、次を使用して翻訳を取得します。
とにかく、このアプローチでは、レコードを見つけるのに約30マイクロ秒かかりますが、同じ結果を達成するためのより良い方法はありますか?
更新:将来の参考のために、提案されているようにTDictionaryを使用する新しい実装をここに記述します(Delphi 2009以降で動作します):
新しいGetTranslation関数は、最初のバージョンよりも1000倍高速に実行されます(私の2000サンプルレコードで)。
delphi - カスタム Delphi コンポーネントで stringlist プロパティを実装する方法は?
初めてのカスタム Delphi コンポーネントを作成しています。基本的には、ヘッダーと行のテキストが表示されたカスタム Tpanel です。
stringlist を使用して複数行のテキストを追加できるようにしたいと考えています。
コンポーネントをテストするときに、行を追加するときにテキスト行をパネルに表示できません: NewLinesText.add('line1 text')
ただし、実行時に新しい文字列リストを作成して入力し、それを自分のコントロールに割り当てると機能します: controlPanelitem.NewLinesText = MyNewStringlist
次のような行を追加できるようにしたい: NewLinesText.add('line1 text')
WinXP で Delphi 7 プロフェッショナルを使用しています。以下のコードを参照してください。
どんな助けでも大歓迎です!