DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

StringSpliterにまつわる話


 ∩| 
 ミ ゙''゙゙゙つ    アラヨット
 ミ∧,,∧   
 ミ,,゚Д゚彡
 U U    

       

2011/07/14(木)
TStringSpliterのソースを公開するのは、少し骨が折れるっす。


まず。
Split関数が必要だったので自分としては次のような関数を作ってみました。
WordGet(S=元の文字, Index=何個目, Delimiter=区切り文字, Option=区切り方法);
WordCount(WordGetの引数からIndexを除く)

これらは、「A/B/C/D」という文字列からスラッシュで区切られた部分が
何個あるかとか、何番目の文字を取り出すのか、ということを目的に作ってます。


で、これはWordGetやWordCountを行うたびに処理が行われるので
同じ処理を何度もするのも不便なので、一度行ったらそれを覚えておいてくれる
StringSpliterクラスを作ったというわけです。
Create時に分解すれば、後から
StringSpliter.Word[Index]
とすることでアクセスできるというわけ。

区切り方法は、「A///B/C//D//」を要素4として区切るか、空文字含めて要素9として区切るかという違い。
区切り文字は同時に複数指定できるようにしています。
「A/B,C;D」でも、区切り文字を動的配列パラメータで渡せば区切れます。

で、この処理自体を

StringRecordListに任せています。

StringRecordListというのは、どこからきているかというと
TListのコピーから、TIntegerListとか、TRectListとかTPointListとか
includeを使って、昔のDelphiでも使える汎用リストを
Stringに対して適用したものです。
同じ仕組みで、TWideStringRecordListもつくりそれが
うちのEmEditorPluginでは使われています。

TStringListがUnicode対応する前から便利に使っていました。

他の型に対するリストには含まれていませんが、
StringListやWideStringListには、テキストプロパティに値を代入する処理で
改行コードが含まれていれば、それに応じて要素を分解する
という処理があって、そこを汎用化して
あらゆる文字列に対してそれを分解して格納するということができるのですが

それを、TStringSpliterやWordCount、WordGetで使っています。

内部では、部分文字列一致関数なども使っていて
つまり、Pos関数の拡張版の任意位置から指定位置までの文字列一致調査系の関数なども自作して
それをつかっているということ。


こうなってくると、どこまでのソースを公開すれば、他の人に使えるようになるか、
把握がとても難しくなってきます。

ただ、便利なのは、自分が使う上では、実に自在にすばやく求めている機能を作ることができるわけです。

StringListにもD2006からは、StrictDelimiterプロパティが採用されて
だいぶ処理しやすくなりましたが、
行の文字要素と改行コード要素。その改行コード要素にも、CRとLFとCRLFとがあるという
複雑さを考えると、StringListでは力不足な面もあるので
自作クラス郡の方が、使える道具なんですよね。

もはや手になじみすぎて、JEDIのライブラリを調べて使い方を学ぶよりも早く開発できたりします。

ライブラリ調べても、自分の目的とする処理までを
そのライブラリが汎用的にサポートされているとは限りませんから、難しいところ。

たとえば、そんな状況は.NETでも、あまり変わらないです。
軽く検索してみました。

@IT:.NET TIPS 文字列を文字列により分割するには?(VB.NET関数活用) - C#
http://www.atmarkit.co.jp/fdotnet/dotnettips/317vbsplit/vbsplit.html
>StringクラスSplitメソッドでは文字列を「文字列」により分割することはできない。
>VB.NETのSplit関数が使える。

とあるが、区切り文字列を複数指定することはできないみたいです。

分解した後も、文字の動的配列だとすると、ちょっと不便かも。
IndexOfで値をみつけたり、ソートしたり、移動したり、削除したり、
そういう処理もリスト構造として処理を持っているほうが、楽な気がする。


つー、ことで自作ライブラリマンセーと、なったりするわけだけれども

で、、、こんな話、
ソースも公開せずに、何の役に立つの、ってことなんですが、

要するにプログラミングする場合、必要であれば汎用的に部品を組んでいって欲しいということです。



・・・つづくかも。つづかないかも・・・
スポンサーサイト

| 未分類 | 12:59 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。