Scala - Разделить массив внутри массива, извлечь определенную информацию и применить к классу дел - PullRequest
0 голосов
/ 13 февраля 2020
uri:23e6b806-7a39-4836-bae2-f369673defef offset:1
uri:z65e9d4e-a099-41a1-a9fe-3cf74xbb01a4 offset:2
uri:2beff8bf-1019-4265-9da4-30c696397e08 offset:3
uri:3b1df8bb-69f6-4892-a516-523fd285d659 offset:4
uri:4f961415-b847-4d2c-9107-87617671c47b offset:5
uri:015ba25c-c145-456a-bae7-ebe999cb8e0f offset:6
uri:z1f9592f-64d0-443d-ad0d-38c386dd0adb offset:7

Выше приведены массивы массивов. Каждая строка является элементом в массиве, но сам по себе это массив. Я сделал это, разделив каждую строку на запятую и удалив ее. То, что я пытаюсь сделать, это только извлечь URI и смещение и применить его к классу дела.

case class output2(uri: String, offset: Int)

Все, что я хочу, это фактические значения, поэтому каждый экземпляр дела класс, URI и смещение будут в следующем формате -

e1af5db7-3aad-4ab0-ac3a-55686fccf6ae

1

Я пытаюсь найти простой способ сделать это.

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Не нужно split() каждую строку через запятую. Сделайте запятую частью распознанного шаблона ввода.

val data = Array("uri:23e6b806-7a39-4836-bae2-f369673defef,offset:1"
                ,"uri:z65e9d4e-a099-41a1-a9fe-3cf74xbb01a4,offset:2"
                ,"poorly formatted data will be ignored"
                ,"uri:2beff8bf-1019-4265-9da4-30c696397e08,offset:3"
                ,"uri:3b1df8bb-69f6-4892-a516-523fd285d659,offset:4"
                ,"uri:4f961415-b847-4d2c-9107-87617671c47b,offset:5"
                ,"uri:015ba25c-c145-456a-bae7-ebe999cb8e0f,offset:6"
                ,"uri:z1f9592f-64d0-443d-ad0d-38c386dd0adb,offset:7")

case class Data(uri:String, offset:Int)

val dataRE = "uri:([^,]+),offset:(\\d+)".r

val rslt:Array[Data] = data.collect{case dataRE(uri, os) => Data(uri, os.toInt)}
0 голосов
/ 14 февраля 2020

Я бы сделал это так:

  case class Output(uri: String, offset: Int)

  val lines = Source
    .fromFile("input")
    .getLines
    .toList

  def parseUri(s: String): Option[String] = 
    s.splitAt(s.indexOf(":") + 1)._2 match {
      case "" => None
      case uri => Some(uri)
    }

  def parseOffset(s: String): Option[Int] = 
    s.splitAt(s.indexOf(":") + 1)._2 match {
      case "" => None
      case offset => Some(offset.toInt)
    }

  def parseOutput(xs: Array[String]): Option[Output] = for {
    uri <- parseUri(xs(0))
    offset <- parseOffset(xs(1))
  } yield {
    Output(uri, offset)
  }

  lines.map(_.split(" ")).flatMap { x =>
    parseOutput(x)
  }
0 голосов
/ 13 февраля 2020

Вы можете построить свои данные, проверяя guid с помощью регулярных выражений, таких как:

val regexp = """uri:(\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b) offset:([0-9]+)""".r
val regexp(pattern, value) = "uri:23e6b806-7a39-4836-bae2-f369673defef offset:1"

output2(pattern, value.toInt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...