在Scala中,为什么Array(“ 1”)++“ -3”输出Array [Any] = Array(1,-,3)?

时间:2018-10-10 11:40:14

标签: scala

为什么在Scala 2.12.6中Array("1") ++ "-3"输出res1: Array[Any] = Array(1, -, 3)

如何获得结果Array("1", "-3")

5 个答案:

答案 0 :(得分:8)

++运算符将两个列表(或其他集合)连接在一起。正如@ senjin.hajrulahovic指出的那样,字符串本质上只是Chars的列表,编译器将以这种方式对待它(并返回Array[Any]

您可以通过多种方式解决此问题。例如,Array("1") ++ Array("-3")(将两个数组加在一起)或Array("1") :+ "-3"将值放在数组的末尾。

答案 1 :(得分:3)

因为scala将"-3"视为字符'-''3'的字符序列。

如果要将字符串“ -3”附加为一个元素,请使用:+

答案 2 :(得分:3)

++binary operator(也称为方法),用于连接两个集合。 ArrayList。 如果第一个操作数是Array,则结果默认为Array。 如果第一个操作数是List,则结果默认为List

默认情况下,编译器将"-3"视为String。 所有字符串也可以视为集合(需要时通过隐式转换)。但是什么类型的收藏呢?是Array吗?是List吗?取决于其用法以及所操作的集合的类型。

例如,     在将其用作Array("1") ++ "-3"时,the String "-3"在默认情况下将被编译器视为Array[Char],因为++的第一个操作数是{{1} }(尽管默认情况下,编译器会始终将元素的类型设为Array)     在将其用作Char时,List("1") ++ "-3" the String默认情况下将被视为"-3",因为List[Char]的第一个操作数是++(尽管默认情况下,由编译器将元素的类型始终为List

Char运算符遇到两个操作数都是不同类型的元素的集合时,它们在++中最接近的super-type将是结果集合的元素类型。     type-hierarchy的{​​{1}},它是第一个操作数(集合)和super-type的元素类型, 第二个操作数(集合)的元素类型为String。 所以 Char的结果是Any

如果要将Array("1") ++ "-3" Array[Any]作为元素添加到集合String,则必须将其作为元素添加到此集合。还有另一种方法,例如"-3"Array("1"),如下所示将元素添加或添加到集合中。

要附加到集合中:

:+

要添加到收藏集:

+:

执行上述操作的另一种方法如下(将元素转换为集合并使用scala> Array("1") :+ "-3" res6: Array[String] = Array(1, -3) 方法):

scala> "-3" +: Array("1")
res7: Array[String] = Array(-3, 1)

答案 3 :(得分:2)

最后我找到了解释here

以下是摘录自此。

  

如何向数组添加(附加和添加)元素

     

您无法调整Scala Array的大小,但可以使用这些运算符   (方法)在分配元素时将元素追加和添加到数组之前   结果到一个新变量:

     
┌──────────────────────────┬─────────────────┬──────────────────────────────┐
│ Method                   │  Description    │  Example                     │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ :+                       │ append 1 item   │ oldArray :+ e                │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ ++                       │ append N items  │ oldArray ++ newArray         │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ +:                       │ prepend 1 item  │ e +: oldArray                │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ ++:                      │ prepend N items │ newArray ++: oldArray        │
└──────────────────────────┴─────────────────┴──────────────────────────────┘
     

附加和添加示例

     

这些示例说明了如何使用这些方法追加和添加前缀   Array的元素:

     
val v1 = Array(4,5,6)         // Array[Int] = Array(4, 5, 6)
val v2 = v1 :+ 7              // Array(4, 5, 6, 7)
val v3 = v2 ++ Array(8,9)     // Array(4, 5, 6, 7, 8, 9)

val v4 = 3 +: v3              // Array(3, 4, 5, 6, 7, 8, 9)
val v5 = Array(1,2) ++: v4    // Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

答案 4 :(得分:0)

我这里有一条小窍门对我有帮助。要记住“附加”运算符是做什么的,请考虑:++:,它们将一个元素附加到列表中,因为它是“ 运算符是冒号的一面-是“集合”的一面。”这将告诉您哪个操作数代表什么,并且还有区别的理由。