0

ケースクラスのインスタンスであるオブジェクトで構成されるこのリストを考えてみましょう:

A, B, Opt(A),C, Opt(D), F, Opt(C), G, Opt(H)

この結果を得るために、このリストを正規化したいと思います。

A, B, C, Opt(D), F, G, Opt(H)

ご覧のとおり、要素があり、それらをそのまままたは別の方法で置き換える場合、要素AOpt(A)削除Aする必要がありOPT(A)ます。

をお願いします:

  • パフォーマンスの平均における最適解
  • 最短の解決策
4

3 に答える 3

2

最も効率的なソリューションではありませんが、確かに単純なソリューションです。

scala> case class Opt[A](a: A)
defined class Opt

scala> val xs = List(1, 2, Opt(1), 3, Opt(4), 6, Opt(3), 7, Opt(8))
xs: List[Any] = List(1, 2, Opt(1), 3, Opt(4), 6, Opt(3), 7, Opt(8))

scala> xs flatMap {
     |   case o @ Opt(x) => if(xs contains x) None else Some(o)
     |   case x => Some(x)
     | }
res5: List[Any] = List(1, 2, 3, Opt(4), 6, 7, Opt(8))
于 2012-05-12T09:54:13.177 に答える
2

フィルタリングが必要なので、これはもう少し簡潔かもしれません;-):

scala> List(1,2,3,Some(4),5,Some(5))
res0: List[Any] = List(1, 2, 3, Some(4), 5, Some(5))

scala> res0.filter {
     | case Some(x) => !res0.contains(x)
     | case _ => true
     | }
res1: List[Any] = List(1, 2, 3, Some(4), 5)

編集: 大規模なコレクションの場合、 を使用するtoSetか、 を直接使用するとよい場合がありSetます。

于 2012-05-12T20:22:47.103 に答える
1

順序を気にしない場合は、効率から Set を使用します。

xs.foldLeft(Set.empty[Any])({ case (set, x) => x match {
  case Some(y) => if (set contains y) set else set + x
  case y => if (set contains Some(y)) set - Some(y) + y else set + y
}}).toList

または:

val (opts, ints) = xs.toSet.partition(_.isInstanceOf[Option[_]])
opts -- (ints map (Option(_))) ++ ints toList
于 2012-05-12T20:37:20.187 に答える