我对Scala还是陌生的,甚至不确定如何正确地描述我的问题,但是我将尽力通过示例进行解释。
我想过滤一个带有条件的字符串列表,但是该列表包含很多逗号。该列表包含userID
,artID
和等级。例如)
val lst = List("1,1,4", "1,1060,2", "3,123,5", "4,1210,5", "4,1213,4")
以3,123,5
为例,3
是userID
,123
是artID
,而5
是等级。
我想做的是获得高于4的评分,并仅返回(userID
,artID
)的列表(返回为List[(String, String)]
)。我一直在尝试各种方法,但一直失败,而且我不知道如何开始。
答案 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))