この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
情報処理試験などに出てくる「再帰呼び出し」というプログラム構造のサンプルを作ってみます。
再帰呼び出しとは関数内で再びその関数自身を呼び出すことです。
まずはJavaのサンプルです。指定したフォルダ内のすべてのファイル名をトレースするだけのプログラムです。
サンプルではCドライブ直下にsampleフォルダを作成していますが適当に書き換えて下さい。
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) { try{ File rootDir = new File("C:\\sample"); traceFileName(rootDir); System.out.println("終了");
}catch(IOException e){ System.out.println(e); } }
private static void traceFileName(File file) throws IOException{ if(file.isDirectory()) { System.out.println(file.getName());
File[] files = file.listFiles();
for(int i = 0; i < files.length; i++) {
// 配下のファイルに対してtraceFileNameメソッドを実行
traceFileName(files [i]);
}
} else {
System.out.println(file.getName());
}
}
}[/java]
次はFlexでサンプルを作ってみます。今度はフラットなデータを階層構造のあるデータに変換してTreeのdataProviderに代入します。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="creationCompleteHandler(event)">
<fx:Declarations>
<fx:Array id="dp">
<fx:Object code="1" parentCode="0"/>
<fx:Object code="2" parentCode="1"/>
<fx:Object code="3" parentCode="1"/>
<fx:Object code="4" parentCode="1"/>
<fx:Object code="5" parentCode="2"/>
<fx:Object code="6" parentCode="2"/>
<fx:Object code="7" parentCode="3"/>
</fx:Array>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
protected function creationCompleteHandler(event:FlexEvent):void {
var treeData:Object = {code:"0"};
convertToTreeData(dp, treeData);
tree.dataProvider = treeData;
}
private function convertToTreeData(items:Array, parent:Object):void {
for each(var item:Object in items) {
if(item.parentCode == parent.code) {
if(!parent.hasOwnProperty("children")) {
parent.children = new Array();
}
parent.children.push(item);
convertToTreeData(items, item);
}
}
}
]]>
</fx:Script>
<mx:Tree id="tree" width="100%" height="100%" labelField="code"/>
</s:Application>
実行すると以下のようになります。
[SWF]http://public-blog-dev.s3.amazonaws.com/wp-content/uploads/2011/09/SampleTree3.swf, 500, 400[/SWF]
このサンプルを見るにはFlash Playerがインストールされている必要があります。
階層構造のデータを扱う場合はとても便利ですが、呼び出すたびに引数とローカル変数の領域をメモリ上に確保するので注意が必要です。