从矢量SCALA中拆分或提取值

时间:2017-07-06 05:02:19

标签: scala dictionary vector

我正在使用文本文件中的以下列表:

10,44,22
10,47,12
15,38,3
15,41,30
16,44,15
16,47,18
22,38,21
22,41,42
34,44,40
34,47,36
40,38,39
40,41,42
45,38,27
45,41,30
46,44,45
46,47,48

我正在创建一些索引来分析表格,然后如果每列都是(s,p,o)并且我创建了一个P - >的地图。所以我创建它的形式

val dicP_SO: scala.collection.mutable.Map[Int, Vector[Vector[Int]]] = collection.mutable.Map[Int, Vector[Vector[Int]]]()

我读了文件,用

创建了映射
if (dicP_SO.contains(p)) {
   P_SO = dicP_SO.apply(p) :+ Vector(s, o) //To add to the same key the diff
   dicP_SO += (p -> P_SO)                  //(s,o)
}else dicP_SO += (p -> Vector(Vector(s,o)))

这样,如果我把38作为键,我运行以下代码:

dicP_SO.getOrElse(38,Vector(0))

我得到以下内容:

Vector(Vector(15, 3), Vector(22, 21), Vector(40, 39), Vector(45, 27))

我的问题如下:我需要内部的每个向量[Int],我尝试声明一个变量

val a:Vector[Int] = dicP_SO.getOrElse(yi,Vector(0))

我收到Vector [Any]不符合Vector [Int]的错误,我不知道为什么会出现这个错误以及如何修复它

3 个答案:

答案 0 :(得分:0)

由于public static bool validate_login(string user, string pass) { Login_Model.connect = DB_Controller.db_connection(); MySqlCommand cmd = new MySqlCommand(Login_Model.connect); } 返回类型为:dicP_SO.getOrElse(38,Vector(0)),当您将其分配给Vector[Any]时,编译器会抛出错误

您可以通过以下方式完成:

Vector[Int]

使用dicP_SO.get(38).map(_.flatten).getOrElse(Vector(0)) //flatten nest Vector[Vector[Int]] to Vector[Int], and `getOrElse` 展开嵌套集合

flatten

答案 1 :(得分:0)

您应该已经拥有了所需的输出,只需要一种正确的方式来访问它们

scala> val rdd = dicP_SO.getOrElse(38, Vector(0))
rdd: scala.collection.immutable.Vector[Any] = Vector(Vector(15, 3), Vector(22, 21), Vector(40, 39), Vector(45, 27))

scala> rdd.foreach(println)
Vector(15, 3)
Vector(22, 21)
Vector(40, 39)
Vector(45, 27)

<强>被修改

如果要访问每个向量并分配给变量,可以执行

scala> val v1 = rdd(0)
v1: Any = Vector(15, 3)

scala> println(v1)
Vector(15, 3)

答案 2 :(得分:0)

您遇到编译错误的原因是地图中的值的类型为<?xml version="1.0"?> <Telefonliste> <Eintrag> <Name>Meier</Name> <TelNr>891234</TelNr> </Eintrag> <Eintrag> <Name>Schmitz</Name> <TelNr>870887</TelNr> </Eintrag> </Telefonliste> 。因此,当您执行Vector[Vector[Int]]时,getOrElse(yi, Vector(0))值将具有类型Vector(0),因此编译器将尝试引用两种类型的返回类型(Vector[Int]和{{ 1}})为Vector[Vector[Int]]

鉴于你拥有的数据,我建议使用这些数据结构和代码:

Vector[Int]

然后插入新信息:

Vector[Any]

检索密钥val dicP_SO: mutable.Map[Int, List[(Int, Int)]] = mutable.Map[Int, List[(Int, Int)]]() 的信息:

val currentValues = if (dicP_SO.contains(p)) {
    dicP_SO.remove(p)
} else {
    List.empty[(Int, Int)]
}

dicP_SO += p -> currentValues :+ (s, o)

然后您可以根据需要处理信息,例如:

yi