如何在 Scala 中向数组添加元素并查找变量类型?

Posted

技术标签:

【中文标题】如何在 Scala 中向数组添加元素并查找变量类型?【英文标题】:How to add elements to an array in Scala, and find variable type? 【发布时间】:2018-12-16 21:06:00 【问题描述】:

我将以下 Scala 代码块作为我的数据处理管道的一部分。根据我目前的理解,UDF 接受一个参数file_contents,它的类型是String。然后 UDF 会进行一系列字符串处理,包括 split

代码可以正常工作,但我试图以以下方式进行编辑并遇到困难,这主要是由于我对 Scala 缺乏经验,并且难以在网上找到答案。

根据info 的长度,我希望info 能够有2 个空字符串和2 个零。如果info的长度为28,则将这四个值相加,否则继续。我怎样才能在下面的代码中做到这一点?我想在val param_data 之前添加这段代码。

如果有人不介意回答,我还有关于此代码的以下问题。

    如果split 将字符串转换为数组,为什么我不能使用println(info) 打印它的长度?相反,这条线似乎打印了一个非常大的数字,我相信这是所有字符串的总长度。

    你怎么知道这个 UDF 返回了什么?我没有看到像 Python 等中的 return 语句。

    def extract_FileContent_test = udf((file_contents: String) => 
    
       val info = (file_contents.replace("\",\"", "     ")
        .replace("\"", "")
        .replaceAll("    ", "|")
        .replaceAll(" : \r\n", " : empty\r\n")
        .replaceAll("\r\n", "|")
        .replaceAll(" : ", "|")
        .replaceAll(": ", "|")
        .split("\\|")
        .map(x => x.trim.replaceAll(" -", ""))
        .filterNot(s => s == ""))
       println(info.length)
       // type info : Array[String]
    
       // type sec_index : Array[Int]
       val sec_index = info.zipWithIndex.filter(_._1.startsWith("---")).map(_._2)
    
       if (sec_index.length > 2) 
    
       // parse meta_data (beam tuning context) and param_data (beam tuning parameter) separately
    
       val meta_data = (info.slice(0, sec_index(0)).toList.grouped(2)
        .filter(l => l.length == 2)
        .filter(l => l(1) != "Start" & l(1) != "")
        .map  case List(a, b) => b 
        .toArray.mkString(",")
        )
    
       // println(meta_data)
    
       val param_data = (info.slice(sec_index(0) + 1, sec_index(1)).toList.grouped(3)
        .filter(l => l.length == 3)
        .filter  case List(a, b, c) => Try(c.split(" ")(0).toDouble).isSuccess 
        .map  case List(a, b, c) => Array(a, c.split(" ")(0)).mkString(",") 
        .toArray)
       // println(param_data)
    
       /* one meta data will have > 100 param
       so besides meta columns, we add 2 columns for param_name, param_value
       */
       param_data.map(meta_data + "," + _)
       
       else 
       Array[String]()
       
       )
    

【问题讨论】:

你能澄清一下你想在代码中添加什么吗? 我希望能够根据info 的长度在info 数组(如果它是一个数组)中添加2 个空字符串和2 个零。如果info的长度为28,则将这四个值相加,否则继续。 【参考方案1】:
    使用 info.length 获取信息的长度 在 Scala 中,最后一条语句是返回值 - 这里是 if (sec_index.length > 2),因此它要么返回一个空的字符串数组,要么返回最后一个映射后的 params_data

关于向信息添加数据,您可以执行以下操作

val info_with_filler =  if ( info.length<28) info ++  List("","" ,"0","0") else info

然后在后面的代码中使用 info_with_filler 而不是 info

【讨论】:

谢谢,但就像我在问题中所说的那样,println(info.length) 正在打印一个非常大的数字,我认为这是所有字符串的总长度,而不是数组的实际长度。跨度> 在问题中,您 print(info) (给出类型和句柄) info.size 或 info.length 将为您提供数组/列表中的项目数 对不起,我现在更正了。 info.lengthinfo.size 都给出了相同的答案,即 768,而我很确定我的数组的预期长度是 就是长度。您可以检查拆分之前得到的字符串(将其分成两行)并验证 对不起,我很困惑-info 不是拆分前的字符串吗?我尝试通过运行以下命令来使用.toArray.mkString(",")val info = (file_contents.replace("\",\"", " ") .replace("\"", "") .replaceAll(" ", "|") .replaceAll(" : \r\n", " : empty\r\n") .replaceAll("\r\n", "|") .replaceAll(" : ", "|") .replaceAll(": ", "|") .split("\\|") .map(x =&gt; x.trim.replaceAll(" -", "")) .filterNot(s =&gt; s == "")) .toArray.mkString(",") println(info.length) 但结果甚至更高13158

以上是关于如何在 Scala 中向数组添加元素并查找变量类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React native redux 的 reducer 中向数组添加元素?

如何在 Flutter 的 Firestore 中向数组中添加相等的元素?

scala入门系列--数组

在 TypeScript 中向类型化数组添加方法

如何在foreach循环中向数组添加新索引?

有没有办法在 C# 中向数组中添加一些元素?