#29 Kotlin Koans Collections/Fold 해설
1 소개
Kotlin 공식 레퍼런스의 Kotlin Koans Collections/Fold의 해설 기사입니다.
Kotlin Koans를 통해 Kotlin을 배우는 사람들의 도움이 되길 바랍니다.
다만, 레퍼런스를 자력으로 읽는 힘을 기르고 싶은 분은,
곧이 기사를 보지 마십시오!
한 번 각자로 도전하고 나서, 눈에 띄게 된다고 생각합니다
2 fold()/intersect()
fold() : 인수로 initial과 operation을 전달하고 컬렉션의 요소를 순서대로 operation에 적용하고 반환 값으로 결과를 반환합니다.
kotlin koans의 예를 보여줍니다.
listOf(1, 2, 3, 4).fold(1, {
partProduct, element ->
element * partProduct
}) == 24
위의 예에서 인수의 1
는 initial
이고 element -> element * partProduct
는 operation
입니다.
partProdcut에 initialの1
가 전달되고 element에 要素の先頭(1)
가 전달되고 1 * 1
가 계산되어 1
가 반환됩니다.
계산 결과로 반환 된 1
는 partProduct에 할당되고 요소는 요소의 두 번째 (2)가 할당되고 유사한 결과가 이후 반복됩니다.
결국 1*1*2*3*4가 계산되어 24가 반환됩니다.
intersect() : 호출 원의 컬렉션의 요소와 인수로서 건네주는 컬렉션의 요소의 공통 요소를 Set의 요소로서 돌려준다.
val a = listOf(1,2,3,4,5)
val b = setOf(1,2,6,7)
val result = a.intersect(b)
println(result)
위 예제의 실행 결과는 [1,2]
입니다.
3 Collections/Fold 해설
Kotlin Koans Collections/Fold의 해설입니다.
수시로 본 사이트의 내용을 인용하겠습니다.
본문과 코드를 살펴보자.
Implement Shop.getSetOfProductsOrderedByEveryCustomer() using fold.
listOf(1, 2, 3, 4).fold(1, {
partProduct, element ->
element * partProduct
}) == 24
Fold// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
TODO()
}
fun Shop.getSetOfProductsOrderedByEveryCustomer()를 호출하여 모든 고객(Customer)이 공통으로 구입한 Product의 Set를 반환하도록 구현합니다.
각 클래스의 속성은 다음과 같습니다.
Shop 클래스: name(String형), customers(List< Customer >형)
Customer 클래스: name(String형), city(City형), orders(List< Order >형)
Order 클래스: products(List< Product >형), isDelivered(Boolean형)
먼저 모든 고객이 구입한 모든 종류의 Prodcut Set을 생성합니다.
Foldval allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()
다음으로, 모든 고객이 공통으로 구입한 Product를 allProducts
를 이용해 추출해 나갑니다.
추출 할 때 fold ()와 intersect ()를 사용합니다.
다음과 같은 이미지가 됩니다.
(※Customer나 Prodcut에 붙은 첨자의 수는 편의적인 것입니다.)
최종 구현은 다음과 같습니다.
Fold// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
val allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()
return customers.fold(allProducts, {
orderedByAll, customer ->
orderedByAll.intersect(customer.orders.flatMap { it.products }.toSet())
})
}
4 마지막으로
다음은 Kotlin Koans Collections/Compound tasks의 해설을 하겠습니다
Reference
이 문제에 관하여(#29 Kotlin Koans Collections/Fold 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/G-o/items/f06af111b09f2da4539f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
fold() : 인수로 initial과 operation을 전달하고 컬렉션의 요소를 순서대로 operation에 적용하고 반환 값으로 결과를 반환합니다.
kotlin koans의 예를 보여줍니다.
listOf(1, 2, 3, 4).fold(1, {
partProduct, element ->
element * partProduct
}) == 24
위의 예에서 인수의
1
는 initial
이고 element -> element * partProduct
는 operation
입니다.partProdcut에
initialの1
가 전달되고 element에 要素の先頭(1)
가 전달되고 1 * 1
가 계산되어 1
가 반환됩니다.계산 결과로 반환 된
1
는 partProduct에 할당되고 요소는 요소의 두 번째 (2)가 할당되고 유사한 결과가 이후 반복됩니다.결국 1*1*2*3*4가 계산되어 24가 반환됩니다.
intersect() : 호출 원의 컬렉션의 요소와 인수로서 건네주는 컬렉션의 요소의 공통 요소를 Set의 요소로서 돌려준다.
val a = listOf(1,2,3,4,5)
val b = setOf(1,2,6,7)
val result = a.intersect(b)
println(result)
위 예제의 실행 결과는
[1,2]
입니다.3 Collections/Fold 해설
Kotlin Koans Collections/Fold의 해설입니다.
수시로 본 사이트의 내용을 인용하겠습니다.
본문과 코드를 살펴보자.
Implement Shop.getSetOfProductsOrderedByEveryCustomer() using fold.
listOf(1, 2, 3, 4).fold(1, {
partProduct, element ->
element * partProduct
}) == 24
Fold// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
TODO()
}
fun Shop.getSetOfProductsOrderedByEveryCustomer()를 호출하여 모든 고객(Customer)이 공통으로 구입한 Product의 Set를 반환하도록 구현합니다.
각 클래스의 속성은 다음과 같습니다.
Shop 클래스: name(String형), customers(List< Customer >형)
Customer 클래스: name(String형), city(City형), orders(List< Order >형)
Order 클래스: products(List< Product >형), isDelivered(Boolean형)
먼저 모든 고객이 구입한 모든 종류의 Prodcut Set을 생성합니다.
Foldval allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()
다음으로, 모든 고객이 공통으로 구입한 Product를 allProducts
를 이용해 추출해 나갑니다.
추출 할 때 fold ()와 intersect ()를 사용합니다.
다음과 같은 이미지가 됩니다.
(※Customer나 Prodcut에 붙은 첨자의 수는 편의적인 것입니다.)
최종 구현은 다음과 같습니다.
Fold// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
val allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()
return customers.fold(allProducts, {
orderedByAll, customer ->
orderedByAll.intersect(customer.orders.flatMap { it.products }.toSet())
})
}
4 마지막으로
다음은 Kotlin Koans Collections/Compound tasks의 해설을 하겠습니다
Reference
이 문제에 관하여(#29 Kotlin Koans Collections/Fold 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/G-o/items/f06af111b09f2da4539f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
listOf(1, 2, 3, 4).fold(1, {
partProduct, element ->
element * partProduct
}) == 24
// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
TODO()
}
val allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()
// Return the set of products that were ordered by every customer
fun Shop.getSetOfProductsOrderedByEveryCustomer(): Set<Product> {
val allProducts = customers.flatMap{it.orders.flatMap{it.products}}.toSet()
return customers.fold(allProducts, {
orderedByAll, customer ->
orderedByAll.intersect(customer.orders.flatMap { it.products }.toSet())
})
}
다음은 Kotlin Koans Collections/Compound tasks의 해설을 하겠습니다
Reference
이 문제에 관하여(#29 Kotlin Koans Collections/Fold 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/G-o/items/f06af111b09f2da4539f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)