为什么在Scala 2.12.6中Array("1") ++ "-3"
输出res1: Array[Any] = Array(1, -, 3)
?
如何获得结果Array("1", "-3")
?
答案 0 :(得分:8)
++
运算符将两个列表(或其他集合)连接在一起。正如@ senjin.hajrulahovic指出的那样,字符串本质上只是Chars的列表,编译器将以这种方式对待它(并返回Array[Any]
。
您可以通过多种方式解决此问题。例如,Array("1") ++ Array("-3")
(将两个数组加在一起)或Array("1") :+ "-3"
将值放在数组的末尾。
答案 1 :(得分:3)
因为scala将"-3"
视为字符'-'
和'3'
的字符序列。
如果要将字符串“ -3”附加为一个元素,请使用:+
。
答案 2 :(得分:3)
++
是binary operator
(也称为方法),用于连接两个集合。 Array
或List
。
如果第一个操作数是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)
我这里有一条小窍门对我有帮助。要记住“附加”运算符是做什么的,请考虑:+
或+:
,它们将一个元素附加到列表中,因为它是“ 运算符是冒号的一面-是“集合”的一面。”这将告诉您哪个操作数代表什么,并且还有区别的理由。