如何减少()保持集合本身在Scala中的集合?

时间:2015-05-22 09:42:10

标签: scala collections

我只需要减少集合中的元素,但我想将结果保留在结果中。

FILE *fp = fopen("D:\\DriveName.txt", "w"); 
char c;

for (c='A'; c<='Z'; ++c)
{
    fprintf(fp, "%c",c );
}

fclose(fp);

我想得到

scala> List("a","b","c").reduce(_+_)
res0: String = abc

4 个答案:

答案 0 :(得分:3)

这是一种方法(也许不是最优雅,但嘿,它有效):

import collection.generic._
def reduceAsCollection[E,C[_]](s: C[E])(f: (E,E) => E)(implicit cbf: CanBuildFrom[Nothing, E, C[E]], e: C[E] <:< TraversableOnce[E]): C[E] = {
  (cbf() += s.reduce(f)).result
}

强制性的REPL测试:

scala> reduceAsCollection(List("a","b","c"))(_+_)
res14: List[String] = List(abc)

scala> reduceAsCollection(Seq("a","b","c"))(_+_)
res15: Seq[String] = Vector(abc)

正如您所看到的,不仅结果集合具有适当的运行时类型,而且还保留了静态类型(让Seq返回Seq,给出List ,得到一个List

答案 1 :(得分:2)

使用companion方法

def red[T](a: Iterable[T], f: (T,T) => T) = a.companion(a.reduce(f))

<强> EDITED

如果您需要保留静态类型,则选项是使用asInstanceOf

implicit class Reduce[T, C[T] <: Iterable[T]](s: C[T]) {
  def someSortOfReduce(f: (T, T) => T): C[T] = s.companion(s.reduce(f)).asInstanceOf[C[T]]
}
val list = List(1, 2, 3).someSortOfReduce(_ + _)  // list: List[Int] = List(6)
val set = Set(1, 2, 3).someSortOfReduce(_ + _)    // set: Set[Int] = Set(6)

或模式匹配

implicit class Reduce[T, C[T] <: Iterable[T]](s: C[T]) {
  def someSortOfReduce(f: (T, T) => T): C[T] = s.companion(s.reduce(f)) match {
    case a: C[T] => a
  }
}

答案 2 :(得分:1)

我自己找到了解决方案

INSERT  INTO tbResult(NAME, VALUETAG, DESC)
SELECT (select NAME from #TempEmploye) VALUETAG, DESC
FROM #TempTag

答案 3 :(得分:0)

由于您想要的收藏和原始收藏品不共享任何条目,您可以将缩小的结果包装在您想要的任何内容中。

Seq(original.reduce(_+_))