두 Scala 컬렉션의 요소를 비교하고 조건에 따라 세 번째 컬렉션을 만드는 좋은 방법을 찾고 있습니다. 성능 향상을 위해 코드 모양을 희생 할 수 있습니다.두 컬렉션의 모든 요소를 비교하고 세 번째 컬렉션을 만듭니다.
가정하면 다음
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
이라고 생각했지만 적어도 분명히 작동하지 않습니다.
미리 감사드립니다. 1
에 관한
시간을내어 질문에 답변 해 주셔서 감사합니다. 'flatten'은 잘 작동하고 예상 된 결과를 만들어 낸다. 그러나 @Martin은 더욱 컴팩트하게 만들었습니다. 두 가지 구현 모두 어느 정도 성능이 동일해야한다고 생각합니다. – Angelos
@Angelos 예, 그의 해결책은 더 잘 읽을 수 있습니다. – nmat