как преобразовать данные из дублированного списка данных в список данных группы - PullRequest
0 голосов
/ 17 мая 2019

Проблема в картографических данных от class OldCompanyMovie(ocm : List[(company:String, movie:String, actor:String)])

до List[CompanyMovie(company:String, movies: List[Movies(movie:String, actors : List[actor:String])])]

Описание: у актера в том же фильме должен быть список актеров в фильме типа class Movies(movie: String, actors: List[actor:String])

то же самое со списком актера, фильм должен быть списком фильмов в компании, как CompanyMovie(company: String, movies : List[movie:Movies]))

в целом должно быть List[CompanyMovie(company:String, Movies(mv : List[movie:String, List[actor:String]]))]

* Обновление Я пытался получить запасдня, так что ничего плохого, результат близок, но может быть плохая производительность

val companies: List[Company] = oldWorldMovieList.map { item =>
              val moviesOfeachCompany: List[Option[Pattern]] = oldWorldMovieList.map { oldWML =>
                if (item.company == oldWML.company) {
                    val actorsOfeachMovie: List[Option[String]] = oldWorldMovieList.map { oldWML2 => 
                      if (item.movie == oldWML2.movie) {
                        Some(oldWML2.actor)
                      } else None
                    }.distinct
                    Some(Pattern(item.movie, actorsOfeachMovie))
                } else None
              }.distinct
              Company(item.company, moviesOfeachCompany)
            }.distinct
            val worldMovies: WorldMovies = WorldMovies(companies)

пс.Я не могу изменить шаблон исходных данных.

если это Json Это будет так List[String, String, String]

[{"company":"Marvel","movie":"Avengers","actor":"ROBERT DOWNEY JR."},{"company":"Marvel","movie":"Avengers","actor":"CHRIS EVANS"},{"company":"Marvel","movie":"Avengers","actor":"MARK RUFFALO"},{"movie":"Marvel","movie":"Guardian of the galaxy","actor":"KAREN GILLAN"},{"company":"Marvel","movie":"Guardian of the galaxy","actor":"ZOE SALDANA"},{"company":"dc","movie":"Batman","actor":"CHRISTIAN BALE"},{"company":"dc","movie":"Batman","actor":"CHRISTOPHER REEVE"}]

После преобразования это должно быть вот это

[{"company": "Marvel", "movies" : [{"movie": "Avengers", "actor": ["ROBERT DOWNEY JR.", "CHRIS EVANS", "MARK RUFFALO"]},{"movie": "Guardian of the galaxy", "actor": ["KAREN GILLAN", "ZOE SALDANA"]}]},{"company": "dc","movies" : [{"movie": "Batman", "actor": ["CHRISTOPHER REEVE", "CHRISTIAN BALE"]}]}]

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Похоже на Norw 100 решение, но (ИМХО) проще и прямее.
Кроме того, поскольку он также использует Iterators, он может быть более производительным.

final case class OldModel(company: String, movie: String, actor: String)
final case class Company(name: String, movies: List[Movie])
final case class Movie(name: String, actors: List[String])

def toNewModel(oldData: List[OldModel]): List[Company] =
  oldData
    .groupBy(_.company)
    .iterator
    .map { case (company, group) =>
      val movies =
        group
          .groupBy(_.movie)
          .iterator
          .map { case (movie, group) =>
            val actors = group.map(_.actor)
            Movie(movie, actors)
          }.toList
      Company(company, movies)
    }.toList
0 голосов
/ 17 мая 2019

Я думаю, что вы можете сделать это довольно элегантно, используя groupBy. Например:

case class CompanyMovie(company: String, movies: Seq[Movie])
case class Movie(name: String, actors: Seq[String])

def convert(in: Seq[(String, String, String)]): Seq[CompanyMovie] = {
  val byCompany = in.groupBy(_._1)
  val byCompanyAndMovie = byCompany.mapValues(_.groupBy(_._2).toSeq)
  byCompanyAndMovie.toSeq.map {
    case (company, rawMovies) => 
      val movies = rawMovies.map {
        case (name, t) => Movie(name, t.map(_._3))
      }

      CompanyMovie(company, movies)
  }
}
0 голосов
/ 17 мая 2019

Моя попытка.Я не уверен, что это хорошая практика.

val companies: List[Company] = oldWorldMovieList.map { item =>
          val moviesOfeachCompany: List[Option[Pattern]] = oldWorldMovieList.map { oldWML =>
            if (item.company == oldWML.company) {
                val actorsOfeachMovie: List[Option[String]] = oldWorldMovieList.map { oldWML2 => 
                  if (item.movie == oldWML2.movie) {
                    Some(oldWML2.actor)
                  } else None
                }.distinct
                Some(Pattern(item.movie, actorsOfeachMovie))
            } else None
          }.distinct
          Company(item.company, moviesOfeachCompany)
        }.distinct
        val worldMovies: WorldMovies = WorldMovies(companies)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...