Учитывая Seq[Person]
, который содержит 1- n Person
с (и минимум 1 человек, имеющий "Том"), какой самый простой способ найти Person
с именем "Том ", а также Человек прямо перед Том и Человек сразу после Том?
Более подробное объяснение:
case class Person(name:String)
Списокчеловек может быть произвольно длинным, но будет иметь хотя бы одну запись , которая должна быть "Томь".Таким образом, эти списки могут быть действительными:
val caseOne = Seq(Person("Tom"), Person("Mike"), Person("Dude"),Person("Frank"))
val caseTwo = Seq(Person("Mike"), Person("Tom"), Person("Dude"),Person("Frank"))
val caseThree = Seq(Person("Tom"))
val caseFour = Seq(Person("Mike"), Person("Tom"))
Вы поняли идею.Поскольку у меня уже есть «Том», задача состоит в том, чтобы получить его левого соседа (если он существует) и правого соседа (если он существует).
Каков наиболее эффективный способ добиться этого вЛа Скала?
Мой текущий подход:
var result:Tuple2[Option[Person], Option[Person]] = (None,None)
for (i <- persons.indices)
{
persons(i).name match
{
case "Tom" if i > 0 && i < persons.size-1 => result = (Some(persons(i-1)), Some(persons(i+1))) // (...), left, `Tom`, right, (...)
case "Tom" if i > 0 => result = (Some(persons(i-1)), None) // (...), left, `Tom`
case "Tom" if i < persons.size-1 => result = (Some(persons(i-1)), None) // `Tom`, right, (...)
case "Tom" => result = (None, None) // `Tom`
}
}
Просто не чувствую, что я делаю это scala way .
Решение Мукеша Праджапати:
val arrayPersons = persons.toArray
val index = arrayPersons.indexOf(Person("Tom"))
if (index >= 0)
result = (arrayPersons.lift(index-1), arrayPersons.lift(index+1))
Довольно короткое, кажется, охватывает все случаи.
Решение поанудж саксена
result = persons.sliding(3).foldLeft((Option.empty[Person], Option.empty[Person]))
{
case ((Some(prev), Some(next)), _) => (Some(prev), Some(next))
case (_, prev :: Person(`name`) :: next :: _) => (Some(prev), Some(next))
case (_, _ :: prev :: Person(`name`) :: _) => (Some(prev), None)
case (_, Person(`name`) :: next :: _) => (None, Some(next))
case (neighbours, _) => neighbours
}