Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala中轻松地将IndexedSeq[Array[Int]]转换为Seq[Seq[Int]]?_Scala_Collections_Type Conversion - Fatal编程技术网

如何在Scala中轻松地将IndexedSeq[Array[Int]]转换为Seq[Seq[Int]]?

如何在Scala中轻松地将IndexedSeq[Array[Int]]转换为Seq[Seq[Int]]?,scala,collections,type-conversion,Scala,Collections,Type Conversion,我有一个函数,它接受整数列表,特别是Seq[Seq[Int]]。然后我通过读取一个文本文件并使用split,生成一个数组的列表来生成这些数据。Scala无法识别这一点,因为它会引发匹配错误。但是IndexedSeq或Array单独使用Seq[Int]函数都是可以的,显然只有嵌套的集合是个问题。如何将IndexedSeq[Array[Int]]隐式转换为Seq[Seq[Int]]],或者除了使用下面演示的toList之外,我还能如何进行转换Iterable[Iterable[Int]]似乎很好,但

我有一个函数,它接受整数列表,特别是
Seq[Seq[Int]]
。然后我通过读取一个文本文件并使用
split
,生成一个
数组的列表来生成这些数据。Scala无法识别这一点,因为它会引发匹配错误。但是
IndexedSeq
Array
单独使用
Seq[Int]
函数都是可以的,显然只有嵌套的集合是个问题。如何将
IndexedSeq[Array[Int]]
隐式转换为
Seq[Seq[Int]]]
,或者除了使用下面演示的
toList
之外,我还能如何进行转换<例如,code>Iterable[Iterable[Int]]
似乎很好,但我不能使用它

scala> def g(x:Seq[Int]) = x.sum
g: (x: Seq[Int])Int

scala> g("1 2 3".split(" ").map(_.toInt))
res6: Int = 6

scala> def f(x:Seq[Seq[Int]]) = x.map(_.sum).sum
f: (x: Seq[Seq[Int]])Int

scala> f(List("1 2 3", "3 4 5").map(_.split(" ").map(_.toInt)))
<console>:9: error: type mismatch;
 found   : List[Array[Int]]
 required: Seq[Seq[Int]]
              f(List("1 2 3", "3 4 5").map(_.split(" ").map(_.toInt)))
                                          ^

scala> f(List("1 2 3", "3 4 5").map(_.split(" ").map(_.toInt).toList))
res8: Int = 18
scala>def g(x:Seq[Int])=x.sum
g:(x:Seq[Int])Int
scala>g(“1.23.split(“”).map(uu.toInt))
res6:Int=6
scala>def(x:Seq[Seq[Int]]=x.map(uu.sum).sum
f:(x:Seq[Seq[Int]])Int
scala>f(列表(“1.23”,“3.45”).map(u.split(“”.map(u.toInt)))
:9:错误:类型不匹配;
找到:列表[数组[Int]]
必填项:Seq[Seq[Int]]
f(列表(“1.23”,“3.4.5”).map(u.split(“”.map(u.toInt)))
^
scala>f(列表(“1.23”,“3.45”).map(u.split(“”.map(u.toInt.toList))
res8:Int=18
这个怎么样:

implicit def _convert(b:List[Array[Int]]):Seq[Seq[Int]]=b.map(_.toList)
这个怎么样:

implicit def _convert(b:List[Array[Int]]):Seq[Seq[Int]]=b.map(_.toList)

将f重新定义为更灵活一点

因为f是List、Seq、Array等的父级,所以如果f基于可遍历性,它将与这些容器兼容。Traversable有求和、展平和映射,这就是所需的全部

这件事的棘手之处在于

def f(y:Traversable[Traversable[Int]]):Int = y.flatten.sum
非常挑剔,对类型为
List[Int]]
的y不起作用,尽管它对
Array[Int]]

为了使它不那么挑剔,一些类型视图边界将起作用

最初,我用展平/求和操作替换了求和

def f[Y<%Traversable[K],K<%Traversable[Int]](y:Y):Int=y.flatten.sum
测试:


将f重新定义为更灵活一点

因为f是List、Seq、Array等的父级,所以如果f基于可遍历性,它将与这些容器兼容。Traversable有求和、展平和映射,这就是所需的全部

这件事的棘手之处在于

def f(y:Traversable[Traversable[Int]]):Int = y.flatten.sum
非常挑剔,对类型为
List[Int]]
的y不起作用,尽管它对
Array[Int]]

为了使它不那么挑剔,一些类型视图边界将起作用

最初,我用展平/求和操作替换了求和

def f[Y<%Traversable[K],K<%Traversable[Int]](y:Y):Int=y.flatten.sum
测试:


问题是
Array
没有实现
SeqLike
。通常,对
scala.predef
中定义的
ArrayOps
WrappedArray
的隐式转换允许像
Seq
一样使用数组。但是,在您的示例中,数组作为泛型参数被隐式转换“隐藏”。一种解决方案是提示编译器可以对泛型参数应用隐式转换,如下所示:

def f[C <% Seq[Int]](x:Seq[C]) = x.map(_.sum).sum

现在,假设存在从
C
Seq[Int]
的隐式转换,这确实存在于predef中。

问题在于
数组
没有实现
Seq-like
。通常,对
scala.predef
中定义的
ArrayOps
WrappedArray
的隐式转换允许像
Seq
一样使用数组。但是,在您的示例中,数组作为泛型参数被隐式转换“隐藏”。一种解决方案是提示编译器可以对泛型参数应用隐式转换,如下所示:

def f[C <% Seq[Int]](x:Seq[C]) = x.map(_.sum).sum

现在,假设存在从
C
Seq[Int]
的隐式转换,这确实存在于predef中。

有趣的问题。我认为这与不可变集合和可变集合的关系更大。请注意
f(List(“1,2,3.split”(“,”).map(u.toInt),“1,2,3.split”(“,”).map(u.toInt))
实际上是如何工作的……疯狂的事情,如果您分配它并将值作为参数传递,它就不起作用了。但是如果你在函数调用中内联这个表达式,它会工作!!??我猜,通过打破第一个映射并在函数调用中运行表达式,类型推断和默认隐式转换可以发挥其神奇的作用,但在其他方面则不行。。。我想我以前从未见过这样的例子!有趣的问题。我认为这与不可变集合和可变集合的关系更大。请注意
f(List(“1,2,3.split”(“,”).map(u.toInt),“1,2,3.split”(“,”).map(u.toInt))
实际上是如何工作的……疯狂的事情,如果您分配它并将值作为参数传递,它就不起作用了。但是如果你在函数调用中内联这个表达式,它会工作!!??我猜,通过打破第一个映射并在函数调用中运行表达式,类型推断和默认隐式转换可以发挥其神奇的作用,但在其他方面则不行。。。我想我以前从未见过这样的例子!仅供参考,不推荐使用视图边界:。你应该使用隐式参数来代替,根据这条线索:@Tim interest read,大多数人赞成反对,少数人认为视图边界将得到改善和保持,还有其他一些优点。我刚刚开始学习scala的一些更复杂的部分,而未解决的部分和语法更改并不十分吸引人。很高兴把它当作一种谜题来玩,但兴趣可能到此为止……从那次讨论中,我觉得反对视图边界的决定是明确的,尽管它要到2.14左右才会真正发生。在上面,我提供了另一个答案,如果你好奇的话,我会对%symbol进行“不修饰”。谢谢,这是一个很好的建议,我已经尝试过了。但就像我经常遇到的那样,我在这里举的一个简单的例子太简单了。在我的实际应用程序中,我需要
deffun[T](xx:Seq[Seq[T]])=xx映射(u.reverse)
,并且
可遍历的
没有
反向
。s