Scala过滤带有多个逗号的字符串列表

时间:2018-11-21 05:08:39

标签: string scala list split

我对Scala还是陌生的,甚至不确定如何正确地描述我的问题,但是我将尽力通过示例进行解释。 我想过滤一个带有条件的字符串列表,但是该列表包含很多逗号。该列表包含userIDartID和等级。例如)

val lst = List("1,1,4", "1,1060,2", "3,123,5", "4,1210,5", "4,1213,4")

3,123,5为例,3userID123artID,而5是等级。 我想做的是获得高于4的评分,并仅返回(userIDartID)的列表(返回为List[(String, String)])。我一直在尝试各种方法,但一直失败,而且我不知道如何开始。

4 个答案:

答案 0 :(得分:2)

您说要过滤“字符串列表”。所以我认为您的输入可能像这样。

val lst = List("1,1,4", "1,1060,2", "3,123,5", "4,1210,5", "4,1213,4")

在这种情况下,存在对String元素进行数字比较的问题。

"4"  < "5"  //true
"14" > "5"  //false

您可以在比较之前将String强制转换为Int,但这还应包括转换失败的测试。

这是一种略有不同的方法,该方法仅传递所有rating字符串(数字或其他),其结果大于"4"。未split()进入正确数目的子字符串的字符串将被过滤掉。

lst.map(_.split(",")).collect{
  case Array(uID,aID,r) if r.length > 1 || r > "4" => (uID,aID)
}
//res0: List[(String,String)] = List((3, 123), (4, 1210))

答案 1 :(得分:0)

val lst = List("1,1,4", "1,1060,2", "3,123,5", "4,1210,5", "4,1213,4")

val res = lst
  .map(_.split(","))
  .collect {
    case Array(a,b,c) if c.toInt>4 => (a,b)
  }

println(res)

答案 2 :(得分:0)

检查一下:

scala> val lst = List("1,1,4", "1,1060,2", "3,123,5", "4,1210,5", "4,1213,4")
lst: List[String] = List(1,1,4, 1,1060,2, 3,123,5, 4,1210,5, 4,1213,4)

scala> lst.filter(x=> { val y=x.split(",").map(_.toInt); y(2)>4}).map(x=>{val y = x.split(","); (y(0),y(1))} )
res16: List[(String, String)] = List((3,123), (4,1210))

scala>

答案 3 :(得分:0)

您可以通过多种方式做到这一点:

val lst = List("1,1,4", "1,1060,2", "3,123,5", "4,1210,5", "4,1213,4")

  val ans: List[(String, String)] = lst.filter(elem => elem.split(",")(2).toInt > 4).map { e =>
    val s = e.split(",")
    (s(0), s(1))
  }

  val ans2: List[(String, String)] = lst.map {
    _.split(",")
  } collect {
    case Array(a, b, c) if c.toInt > 4 => (a, b)
  }

  val ans3: List[(String, String)] = lst.foldLeft(List[(String, String)]()) {
    (a, b) => {
      val sp = b.split(",")
      if (sp(2).toInt > 4) {
        (sp(0), sp(1)) :: a
      } else a
    }
  }

  println(ans) //List((3,123), (4,1210))
  println(ans2) //List((3,123), (4,1210))
  println(ans3) //List((4,1210), (3,123))