scala, фильтрующий список строк с несколькими запятыми - PullRequest
0 голосов
/ 21 ноября 2018

Я очень плохо знаком с 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)]).Я пробовал разные способы, но продолжал терпеть неудачу, и я не знаю, с чего начать.

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Вы можете сделать это различными способами:

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))             
0 голосов
/ 21 ноября 2018

Вы говорите, что хотите отфильтровать «список строк».Поэтому я полагаю, что ваш ввод может выглядеть следующим образом.

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))
0 голосов
/ 21 ноября 2018

Проверьте это:

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>
0 голосов
/ 21 ноября 2018
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)
...