set.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 188 行

SCALA
188
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2003-2008, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: Set.scala 13737 2008-01-18 19:15:23Z michelou $package scala.collection.immutable/** Canonical factories for immutable sets.  The canonical immutable sets are  *  currently implemented using <a href="HashSet.html">immutable hash sets</a>.  */ object Set {  /** The empty set of this type   */  def empty[A]: Set[A] = new EmptySet[A]  /** The canonical factory for this type   */  def apply[A](elems: A*) = empty[A] ++ elems}/** <p> *    This class defines the interface for immutable sets.  Operations *    on an immutable set leave the original set unchanged, and return *    a new set if needed. *  </p> *  <p> *    Concrete set implementations just have to provide functionality for *    the abstract methods in <code>scala.collection.Set</code> as well as *    for <code>+</code> and <code>-</code>. *  </p> *  <p> *    Note that abstract immutable.Set's are not covariant in their type *    parameter.  This is because some implementations cannot support the *    <code>+</code> method for arbitrary types. *  </p> * *  @author  Matthias Zenger, Martin Odersky *  @version 1.1, 03/05/2004 */trait Set[A] extends AnyRef with collection.Set[A] {  /** @return an empty set of arbitrary element type   */  def empty[B]: Set[B]  /** Create a new set with an additional element.   */  def +(elem: A): Set[A]  /** Add two or more elements to this set.    *  @param    elem1 the first element.   *  @param    elem2 the second element.   *  @param    elems the remaining elements.   *  @return a new set with the elements added.   */  def + (elem1: A, elem2: A, elems: A*): Set[A] =     this + elem1 + elem2 ++ elems  /** Add all the elements provided by an iterator   *  of the iterable object <code>elems</code> to the set.   *   *  @param elems  the iterable object containing the elements to be added    *  @return a new set with the elements added.   */  def ++ (elems: Iterable[A]): Set[A] =     (this /: elems) ((s, elem) => s + elem)  /** Add all the elements provided by an iterator to the set.   *  @param elems  the iterator containing the elements to be added    *  @return a new set with the elements added.   */  def ++ (elems: Iterator[A]): Set[A] =     (this /: elems) ((s, elem) => s + elem)  /** <code>incl</code> can be used to add many elements to the set   *  at the same time.   *  @deprecated use <code>+</code> instead   */  @deprecated  def incl(elems: A*): Set[A] = incl(elems)      /** This method will add all the elements provided by an iterator   *  of the iterable object <code>that</code> to the set.   *  @deprecated use <code>++</code> instead   */  @deprecated  def incl(that: Iterable[A]): Set[A] =    that.foldLeft(this)((set, elem) => set + elem)  /** Remove a single element from a set.   *  @param elem the element to be removed   *  @return a new set with the element removed.   */  def -(elem: A): Set[A]      /** Remove two or more elements from this set.   *   *  @param    elem1 the first element.   *  @param    elem2 the second element.   *  @param    elems the remaining elements.   *  @return a new set with the elements removed.   */  def - (elem1: A, elem2: A, elems: A*): Set[A] =     this - elem1 - elem2 -- elems  /** Remove all the elements provided by an iterator   *  of the iterable object <code>elems</code> from the set.   *   *  @param elems An iterable object containing the elements to remove from the set.   *  @return a new set with the elements removed.   */  def -- (elems: Iterable[A]): Set[A] = this -- elems.elements  /** Remove all the elements provided by an iterator   *  <code>elems</code> from the set.   *   *  @param elems An iterator containing the elements to remove from the set.   *  @return a new set with the elements removed.   */  def -- (elems: Iterator[A]): Set[A] =    (this /: elems) ((s, elem) => s - elem)  /** <code>excl</code> removes many elements from the set.   */  @deprecated  def excl(elems: A*): Set[A] = excl(elems)      /** This method removes all the elements provided by an iterator   *  of the iterable object <code>that</code> from the set.   *   *  @param that the iterable collection.   */  @deprecated  def excl(that: Iterable[A]): Set[A] =    that.foldLeft(this)((set, elem) => set - elem)  /** This method computes an intersection with set <code>that</code>.   *  It removes all the elements that are not present in <code>that</code>.   *   *  @param that the set to intersect with.   */  def intersect(that: collection.Set[A]): Set[A] = filter(that.contains)  /** This method is an alias for <code>intersect</code>.    *  It computes an intersection with set <code>that</code>.   *  It removes all the elements that are not present in <code>that</code>.   *   *  @param that the set to intersect with   */   override def ** (that: collection.Set[A]): Set[A] = intersect(that)  /** Returns the set resulting from applying the given function <code>f</code> to each   *  element of this set.   *   *  @param f function to apply to each element.   *  @return a set containing <code>f(a0), ..., f(an)</code>    *          if this set contains <code>a0, ..., an</code>.   */  override def map[B](f: A => B): Set[B] =    foldLeft(empty[B])((set: Set[B], elem: A) => set + f(elem))  /** Applies the given function <code>f</code> to each element of   *  this set, then forms the union of all results.   *   *  @param f function to apply to each element.   *  @return a set containing all elements in each <code>f(a0), ..., f(an)</code>    *          if this set contains <code>a0, ..., an</code>.   */  override def flatMap[B](f: A => Iterable[B]): Set[B] =    foldLeft(empty[B])((set: Set[B], elem: A) => set ++ f(elem))  /** Method <code>filter</code> removes all elements from the set for   *  which the predicate <code>p</code> yields the value <code>false</code>.   *   *  @param p The predicate used to filter the set   */  override def filter(p: A => Boolean): Set[A] =    (this /: toList)((set, elem) => if (p(elem)) set else set - elem)}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?