Advertisement
Guest User

MySet2

a guest
Sep 23rd, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.99 KB | None | 0 0
  1.  
  2. abstract class MySet {
  3.   def insert(v:Int): MySet
  4.   def union(s:MySet): MySet
  5.   def filter(f:Int=>Boolean): MySet
  6.   def remove(v:Int): MySet
  7.   def contains(v:Int): Boolean
  8.   def foreach(f:Int=>Unit): Unit
  9.   def map(f:Int=>Int): MySet
  10. }
  11.  
  12. object EmptySet extends MySet {
  13.   override def toString = ""
  14.   override def insert(v:Int) = MySet(v)
  15.   override def union(s:MySet) = s
  16.   override def filter(f:Int=>Boolean) = MySet.empty
  17.   override def remove(v:Int) = MySet.empty
  18.   override def contains(v:Int) = false
  19.   override def foreach(f:Int=>Unit) = Unit
  20.   override def map(f:Int=>Int) = MySet.empty
  21. }
  22.  
  23. class NonEmptySet(data:Int, left:MySet, right:MySet) extends MySet {
  24.   override def toString = left.toString + data.toString + right.toString
  25.   override def insert(v:Int) = {
  26.     if(v < data) new NonEmptySet(data, left.insert(v), right)
  27.     else new NonEmptySet(data, left, right.insert(v))
  28.   }
  29.  
  30.   override def union(s:MySet) =  this.remove(data) union s.insert(data)
  31.  
  32.   override def filter(f:Int=>Boolean) = {
  33.     if(f(data)) new NonEmptySet(data, left.filter(f), right.filter(f))
  34.     else left.filter(f) union right.filter(f)
  35.   }
  36.   override def remove(v:Int) = filter(_ != v)
  37.   override def contains(v:Int) = {
  38.     if(v == data) true
  39.     else if(left.contains(v) || right.contains(v)) true
  40.       else false
  41.   }
  42.   override def foreach(f:Int=>Unit) = {
  43.     left.foreach(f)
  44.     f(data)
  45.     right.foreach(f)
  46.   }
  47.   override def map(f:Int=>Int) = {
  48.     new NonEmptySet(f(data), MySet.empty, MySet.empty).union(left.map(f).union(right.map(f)))
  49.   }
  50. }
  51.  
  52. object MySet {
  53.   def empty:MySet = EmptySet
  54.   def apply(v:Int) = new NonEmptySet(v, empty, empty)
  55.   def apply(l:List[Int]) = {
  56.     l.foldLeft(empty)((s,e)=>s.insert(e))
  57.   }
  58. }
  59.  
  60. object Main extends App {
  61.   val s1 = MySet((1 to 10000).toList)
  62.   val s2 = MySet((10001 to 20000).toList)
  63.  
  64.   val s3 = s1.union(s2)
  65.  
  66.   println(s3.contains(2000))
  67. }
  68.  
  69. //http://www.scala-lang.org/api/current/#scala.collection.immutable.List
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement