2つのScalaコレクションの要素を比較し、条件に基づいて3つ目のコレクションを生成する素晴らしい方法を探しています。パフォーマンスのためにコードの外観を犠牲にすることができます。2つのコレクションのすべての要素を比較し、3つ目のコレクションを生成します
case class Item(name: String, category: String, code: String, price: Int, freeItem: Option[Item])
val parentItems = Seq(
Item("name_1", "category_A", "code_A", 100, None),
Item("name_2", "category_B", "code_B", 100, None),
Item("name_3", "category_C", "code_C", 100, None)
)
val childItems = Seq(
Item("name_4", "category_A", "code_A", 100, None),
Item("name_5", "category_C", "code_C", 100, None)
)
def isChild(i1: Item, i2: Item): Boolean = {
i1.name != i2.name &&
i1.category == i2.category &&
i1.code == i2.code
}
val parentsWithChildren: Seq[Item] = (
for {
i1 <- parentItems;
i2 <- childItems
} yield {
if (isChild(i1, i2)) Some(i1.copy(freeItem = Some(i2.copy())))
else None
}).filter(_.isInstanceOf[Some[_]]).map(_.get)
上記のスニペットはexcpectedで次の結果、生成されます:私は上記のコードは抜け穴があることを知っているが、それは大丈夫です
Seq(
Item("name_1", "category_A", "code_A", 100,
Some(Item("name_4", "category_A", "company_A", 100, None))),
Item("name_3", "category_C", "code_C", 100,
Some(Item("name_5", "category_C", "company_C", 100, None)))
)
を以下のように仮定し
。私は何を探していますは、次のとおりです。
は、私がもし(isChild(I1、I2))
Some(i1.copy(freeItem = Some(i2.copy()))) else None
と結果.filter(_.isInstanceOf[Some[_]]).map(_.get)
などを避けることができる方法はありますか?部分機能はオプションになりますか?私はここでネストされたループを使用しています。私はJavaでそのようなことをします。それにアプローチする他の方法はありますか?私は最初に
zip
だと思ったが、明らかに少なくともそれ自体は機能しない。
ありがとうございます!
質問に答える時間をとってくれてありがとう。 'flatten'はうまく動作し、期待される結果が得られます。しかし、@Martinはさらにコンパクトにしました。私は両方の実装が多かれ少なかれ同じ性能を発揮すべきだと思います。 – Angelos
@Angelosええ、彼の解決策はより良い、より可読です – nmat