前回のscala勉強会は、仕事で出れなかった訳ですが(´;ω;`)ブワッ
なにやらtreeコマンドが流行っていたらしい(これ とか これ とか)ので、つくってみた・・・けど、結局中途半端w
import java.io.File object TreeTest { /** ディレクトリ(又はファイル)を表すクラス * 再帰的に、すべての子供の階層への参照を保持 * * @param self ファイルまたはディレクトリ * @param child ディレクトリの場合、ディレクトリのなかのファイル。 * ファイルの場合Nil * @param level ディレクトリ階層の深さ */ case class Dir( self:File , child:List[Dir] , level:Int ){ override def toString = { val indent = ( " " * level ) + "|-- " self.getName + "\n" + { child match{ case Nil => "" case _ => { child.mkString( indent ,indent , "" ) } } } } } /** * ある階層から下のファイルとディレクトリをすべて探す * @param dir ディレクトリ * @param level ディレクトリ階層の深さ */ def searchFiles( dir:File ,level:Int ):Dir = { Dir( dir , dir.listFiles.collect { case f if f.isDirectory => searchFiles( f ,level + 1 ) case f if f.isFile => Dir( f , Nil , level + 1 ) }.toList , level ) } }
考えとして、
プリントする前に一度、階層をすべて調べ上げる => その後まとめて一気に表示
ってやろうとした。動作的には、まとめて一気に表示っていうのはできたんだけど
表示結果が、若干結果違う・・・
とにかく単純にしようと短くしたのはいいけど、末尾再帰じゃないしねぇ(´・ω・`)
例えば、scala.collection以下を調べるとこんな感じの実行結果↓
線が繋がってないから明らかに木ではない orz 。
階層の深さでインデントしてるだけ(´Д`)
collection |-- BitSet.scala |-- BitSetLike.scala |-- BufferedIterator.scala |-- DefaultMap.scala |-- generic |-- Addable.scala |-- BitSetFactory.scala |-- CanBuildFrom.scala |-- FilterMonadic.scala |-- GenericCompanion.scala |-- GenericSetTemplate.scala |-- GenericTraversableTemplate.scala |-- Growable.scala |-- HasNewBuilder.scala |-- ImmutableMapFactory.scala |-- ImmutableSetFactory.scala |-- ImmutableSortedMapFactory.scala |-- ImmutableSortedSetFactory.scala |-- IterableForwarder.scala |-- MapFactory.scala |-- MutableMapFactory.scala |-- MutableSetFactory.scala |-- package.scala |-- SeqFactory.scala |-- SeqForwarder.scala |-- SetFactory.scala |-- Shrinkable.scala |-- Sorted.scala |-- SortedMapFactory.scala |-- SortedSetFactory.scala |-- Subtractable.scala |-- TraversableFactory.scala |-- TraversableForwarder.scala |-- immutable |-- BitSet.scala |-- DefaultMap.scala |-- HashMap.scala |-- HashSet.scala |-- IndexedSeq.scala |-- IntMap.scala |-- Iterable.scala |-- LinearSeq.scala |-- List.scala |-- ListMap.scala |-- ListSet.scala |-- LongMap.scala |-- Map.scala |-- MapLike.scala |-- MapProxy.scala |-- NumericRange.scala |-- PagedSeq.scala |-- Queue.scala |-- Range.scala |-- RedBlack.scala |-- Seq.scala |-- Set.scala |-- SetProxy.scala |-- SortedMap.scala |-- SortedSet.scala |-- Stack.scala |-- Stream.scala |-- StringLike.scala |-- StringOps.scala |-- Traversable.scala |-- TreeHashMap.scala |-- TreeMap.scala |-- TreeSet.scala |-- Vector.scala |-- WrappedString.scala |-- IndexedSeq.scala |-- IndexedSeqLike.scala |-- IndexedSeqOptimized.scala |-- interfaces |-- IterableMethods.scala |-- MapMethods.scala |-- SeqMethods.scala |-- SetMethods.scala |-- TraversableMethods.scala |-- TraversableOnceMethods.scala |-- Iterable.scala |-- IterableLike.scala |-- IterableProxy.scala |-- IterableProxyLike.scala |-- IterableView.scala |-- IterableViewLike.scala |-- Iterator.scala |-- JavaConversions.scala |-- LinearSeq.scala |-- LinearSeqLike.scala |-- LinearSeqOptimized.scala |-- Map.scala |-- MapLike.scala |-- MapProxy.scala |-- MapProxyLike.scala |-- mutable |-- AddingBuilder.scala |-- ArrayBuffer.scala |-- ArrayBuilder.scala |-- ArrayLike.scala |-- ArrayOps.scala |-- ArraySeq.scala |-- ArrayStack.scala |-- BitSet.scala |-- Buffer.scala |-- BufferLike.scala |-- BufferProxy.scala |-- Builder.scala |-- Cloneable.scala |-- CloneableCollection.scala |-- ConcurrentMap.scala |-- DefaultEntry.scala |-- DefaultMapModel.scala |-- DoubleLinkedList.scala |-- DoubleLinkedListLike.scala |-- FlatHashTable.scala |-- GrowingBuilder.scala |-- HashEntry.scala |-- HashMap.scala |-- HashSet.scala |-- HashTable.scala |-- History.scala |-- ImmutableMapAdaptor.scala |-- ImmutableSetAdaptor.scala |-- IndexedSeq.scala |-- IndexedSeqLike.scala |-- IndexedSeqOptimized.scala |-- IndexedSeqView.scala |-- Iterable.scala |-- LazyBuilder.scala |-- LinearSeq.scala |-- LinkedEntry.scala |-- LinkedHashMap.scala |-- LinkedHashSet.scala |-- LinkedList.scala |-- LinkedListLike.scala |-- ListBuffer.scala |-- ListMap.scala |-- Map.scala |-- MapBuilder.scala |-- MapLike.scala |-- MapProxy.scala |-- MultiMap.scala |-- MutableList.scala |-- ObservableBuffer.scala |-- ObservableMap.scala |-- ObservableSet.scala |-- OpenHashMap.scala |-- PriorityQueue.scala |-- PriorityQueueProxy.scala |-- Publisher.scala |-- Queue.scala |-- QueueProxy.scala |-- ResizableArray.scala |-- RevertibleHistory.scala |-- Seq.scala |-- Set.scala |-- SetBuilder.scala |-- SetLike.scala |-- SetProxy.scala |-- Stack.scala |-- StackProxy.scala |-- StringBuilder.scala |-- Subscriber.scala |-- SynchronizedBuffer.scala |-- SynchronizedMap.scala |-- SynchronizedPriorityQueue.scala |-- SynchronizedQueue.scala |-- SynchronizedSet.scala |-- SynchronizedStack.scala |-- Traversable.scala |-- Undoable.scala |-- WeakHashMap.scala |-- WrappedArray.scala |-- WrappedArrayBuilder.scala |-- package.scala |-- readme-if-you-want-to-add-something.txt |-- script |-- Location.scala |-- Message.scala |-- Scriptable.scala |-- Seq.scala |-- SeqLike.scala |-- SeqProxy.scala |-- SeqProxyLike.scala |-- SeqView.scala |-- SeqViewLike.scala |-- Set.scala |-- SetLike.scala |-- SetProxy.scala |-- SetProxyLike.scala |-- SortedMap.scala |-- SortedMapLike.scala |-- SortedSet.scala |-- SortedSetLike.scala |-- Traversable.scala |-- TraversableLike.scala |-- TraversableOnce.scala |-- TraversableProxy.scala |-- TraversableProxyLike.scala |-- TraversableView.scala |-- TraversableViewLike.scala |-- views