1

Scala(2.10)を学ぼうとしています。この演習では、ケースクラスがあります。

case class Entry(name: String, version: String) { }

名前属性でソートされたそのようなオブジェクトの2つのシーケンスがあります。

S1 = E1, E3, E4
S2 = F1, F2, F4

新しいシーケンスを作成したい:

S3 = (E1, F1), (None, F2), (E3, None), (E4, F4)

名前属性でペアリングします。できれば、各リストを複数回繰り返す必要はありません。

この問題に対する私のすべての解決策は、スタイルにおいて非常に不可欠になります(たとえば、条件付きで2つの整数をインクリメントし、.get()を使用します)。ある種の魂がより機能的なアプローチを提案できることを願っています。

4

3 に答える 3

4

version例から判断すると、それらの属性を意味しますか?

リストと再帰を使用できます。

def pair(s1: List[Entry], s2: List[Entry]): List[(Option[Entry], Option[Entry])] =
  (s1, s2) match {
    case (Entry(_, v1) :: _, Entry(_, v2) :: _) if v1 == v2 =>
      (Some(s1.head), Some(s2.head)) :: pair(s1.tail, s2.tail)
    case (Entry(_, v1) :: s1t, Entry(_, v2) :: s2t) =>
      if (v1 < v2) (Some(s1.head), None) :: pair(s1.tail, s2)
      else (None, Some(s2.head)) :: pair(s1, s2.tail)
    case (Nil, s2) => s2.map(entry => (None, Some(entry))
    case (s1, Nil) => s1.map(entry => (Some(entry), None)
  }

基本的に、リストに進んでそれらのヘッドを比較し、バージョンが同じ場合は両方のヘッドを取得するか、小さい方のヘッドのみを取得します。次に、リストの末尾に対して同じことを再帰的に実行します。リストの1つが空であることが判明した場合は、他のリストの残りの要素をNoneとエントリのペアにマップするだけです。

于 2013-02-02T17:48:50.530 に答える
0

私が正しく理解しているなら、EX意味name="E"version="X"、そしてあなたは同じバージョンで物事をペアにしたいです。これが私の解決策ですが、残念ながら時間がかかるので、効率が重要な場合は使用しないでください...

val versions = (S1 ++ S2) map { _.version } groupBy (identity) keys
val sortedVersions = versions.toSeq.sorted
sortedVersions map { ver => (S1 find { _.version==ver }, S2 find { _.version==ver }) }

または、可能なバージョンが事前にわかっている場合は、そのシーケンスを作成して、最後の行を実行します。

Seq("1", "2", "3", "4") map { ver => (S1 find { _.version==ver }, S2 find { _.version==ver }) }

結果:

 ArrayBuffer((Some(Entry(E,1)),Some(Entry(F,1))), (None,Some(Entry(F,2))), (Some(Entry(E,3)),None), (Some(Entry(E,4)),Some(Entry(F,4))))

とのペアリングがより一貫しているように見えるので、ここにある代わりに注意してください(None, F2)(None, Some(F2))NoneSome

ところで、それでcase class(...)十分です。その後に空の角かっこを追加する必要はありません{ }

于 2013-02-02T17:47:22.733 に答える
0

iPadに詳細を表示することはできません;)が、各リストをスキャンできる数値に多くのギャップがない場合は、を使用して新しいリストまたはベクトル(ベクトルの方が高速)を作成することにより、ギャップにNoneを挿入します。 axel22のような再帰的アルゴリズムが示したように、コレクションを一緒に圧縮します。

于 2013-02-03T02:57:39.863 に答える