Archive for the ‘基本・文法’ Category

ある文字と、ある文字が違うところを探そうということを、
ロジカルにやろうとすると、実は結構めんどくさい。

一文字、一文字順次見ていき、違うかどうかを見ていっても、
そこそこうまくいくが、ある条件を超えるとうまくいかなかったりする。

でも、すでに世の中に存在するので、うまくやろうと発明する必要はないが、このようなアルゴリズムってどこを探せばいいのかな?と思う。

で、より分かりやすいサイトを見つけたので、メモ。
ここです。

実は、ここにたどり着く前に、いろいろ調べて、アルゴリズムの名前を見つけて、解決できるようになって、自分で必要なくなってから、それをもっとよく知るための情報が見つかるんですよね。

さて、今回は上記サイトを参考(そのまま?)に、ActionScript3用に書き直し、
それをもとに簡単ではありますが、動作を確認できるようにしました。

ソースのダウンロードは、下のFlashのソースViewからできるようになっています。

ちょっと混乱してしまったので・・・記録。
このあたりは別の言語(というかライブラリ)を使っていると、
いろいろ混じってしまって、さらにIDEを過信してしまいはまってしまいます。

ある文字を別の文字に置き換えたいなと。
具体的には
改行コードを<br>に置き換えたかったので、

var foo1:String = "abc\r\ndef";
var foo2:String = foo1.replace(/\r\n/,"<br />");

と、あれ始めしか変換されんぞ・・・・
ああーー

var foo1:String = "abc\r\ndef";
var foo2:String = foo1.replace(/\r\n/g,"<br />");

と記述すると、Flex Builderが/\r\n/g のように色がついています。
んー、gの部分は色が変わっていないから、だめなのかー

と早とちり。

Stringのマニュアルを読んでみることに・・・・

以下抜粋(http://livedocs.adobe.com/flex/3_jp/langref/String.html):
replace(pattern:*, repl:Object):String
指定された pattern をストリングと照合し、新しいストリングを返します。
この新しいストリングでは、pattern と最初に一致した部分が repl で指定された内容に置き換えられます。

ここで、「最初に一致した部分」という説明とFlex Builderの色が変わらない現象に、勝手に勘違いをしてしまいました。

詳細を見れば、きちんとパターンに

/\r\n/g

が使えると書いてあるではありませんか?

きちんと最後までマニュアルは読まなければいけませんね。

以下のような書き方はFlexならではなのかなーということで記述。
XML内の記述方法だけを見れば、いろいろ見るけど、それを同じソース内で利用するのあまり知らないので、
なるほどと思う方もいるかもしれない。(私は思った。)

フォームなどの画面から入力されたデータを1つの変数にまとめるのに、XMLを利用できる。

<mx:Model id="user">
  <user>
  	<name>{f_name.text}</name>
  	<age>{f_age.text}</age>
  	<pref>{f_pref.text}</pref>
  </user>
</mx:Model>

<mx:TextInput id="f_name" />

のようにXML中に{f_name.text}のように変数をバインディングしておき、
それをXMLのオブジェクト1つとして扱う。

1つのまとめておけば、Validatorなども作りやすくなるだろうし、
また、このようにXMLでワンクッション置いていると、入力方法の変更もしやすくなるだろう。

たとえば、こんなXMLがある。

XML:
  1. <office :document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.2">
  2.   </office><office :meta>
  3.     <meta :creation-date>2009-08-11T09:32:05</meta>
  4.     <dc :date>2009-08-11T09:35:06.48</dc>
  5.     <meta :editing-duration>PT00H03M08S</meta>
  6.     <meta :editing-cycles>2</meta>
  7.     <meta :generator>OpenOffice.org/3.0$Win32 OpenOffice.org_project/300m9$Build-9358</meta>
  8.     <dc :description>これはOpenOfficeのドキュメントです。</dc>
  9.     <meta :keyword>OpenOffice</meta>
  10.     <meta :keyword>XML</meta>
  11.     <meta :keyword>操作</meta>
  12.     <dc :subject>サブジェクト</dc>
  13.     <dc :title>これはタイトル</dc>
  14.     <meta :document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="13" meta:word-count="665" meta:character-count="1725"/>
  15.     <meta :user-defined meta:name="Info 1"/>
  16.     <meta :user-defined meta:name="Info 2"/>
  17.     <meta :user-defined meta:name="Info 3"/>
  18.     <meta :user-defined meta:name="Info 4"/>
  19.   </office>

これは、OpenOfficeで作ったドキュメントファイル(odt)ファイルのから取り出したmeta.xmlだ。

通常、名前空間がなければ

var metas:XMLList = _xml.title;

のようにすればよい。
しかし、名前空間があるXMLの場合には、この名前空間を指定しなければいけない。

では、<dc:title />のように名前空間がある要素の取得は以下のようにする。

var _dcNS:Namespace = _xml.namespace("dc");
trace(_xml.dcNS::title);  //  これで「これはタイトル」の文字列が出力される

初めの例でいえば、_xml.title の title が _dcNS::title のようにNamespaceの変数名 + "::" + 要素名 にすればいいのだ。
これが、もっと深い子になると、非常に読みづらくなる。
(※:_xmlは上の内容のXMLオブジェクトです。)

16進数をソースコード上に直接記述するには、

var code:int = 0xff;

のように0xと付ければよい。

では、8進数はといえば、実はActionScript3 では直接記述する方法はないようです。
ただし、

var num:int = 0766;

のように記述してもこれは、8進数ではなく、10進数の766です。
したがって、8進数を入力したい場合には

var num1:int = parseInt("0766",8);
// もしくは
var num2:int = parseInt("766",8);

のように記述する必要があるというわけです。
頭に"0"をつけるのは好き好きで可能です。

また、16進数でparseIntを使うと

var num1:int = parseInt("1f6",16);
var num2:int = parseInt("0x1f6",16);

で問題ない。

ただし、

var i:int = parseInt("790",8);

のように、8進数ではありえない数字[9]があってもエラーにはならなく、
この結果は「7」となってしまうようです。

同様に、n進数はparseInt(number,n)の基数nを変えればいいということです。

では、次に与えられた数字を16進数や、8進数ではどのようになるのだろうか?ということを求めるにはどうしたらいいだろうか?

これは、非常に簡単だ。

var num:int = 504;
trace(num.toString(16)); // 16進数 -- 1f8
trace(num.toString(8));  // 8進数 -- 770
trace(num.toString(2));  // 2進数 -- 111111000

となる。

このような関数は知らなくても、簡単に作れてしまうために調べる手間より作ってしまえと思ってしまうことがあるが、
やっぱり他の人が見ることがあることを考えると標準を使うほうがよいだろう。

RSS
Add to Google

カスタム検索
ソフトウェア&ライブラリ


ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2010年3月
« 2月    
1234567
891011121314
15161718192021
22232425262728
293031  
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ