[SCALA] 두 목록의 직교 제품
SCALA두 목록의 직교 제품
숫자가 여러 문자에 연결된지도 감안할 때
scala> val conversion = Map("0" -> List("A", "B"), "1" -> List("C", "D"))
conversion: scala.collection.immutable.Map[java.lang.String,List[java.lang.String]] =
Map(0 -> List(A, B), 1 -> List(C, D))
나는 숫자의 순서에 따라 모든 가능한 문자 시퀀스를 생성합니다. 예를 들면 :
"00" -> List("AA", "AB", "BA", "BB")
"01" -> List("AC", "AD", "BC", "BD")
나는 함축을 위해이 작업을 수행 할 수 있습니다
scala> val number = "011"
number: java.lang.String = 011
인덱스 당 가능한 일련의 문자 만들기
scala> val values = number map { case c => conversion(c.toString) }
values: scala.collection.immutable.IndexedSeq[List[java.lang.String]] =
Vector(List(A, B), List(C, D), List(C, D))
가능한 모든 문자 시퀀스를 생성
scala> for {
| a <- values(0)
| b <- values(1)
| c <- values(2)
| } yield a+b+c
res13: List[java.lang.String] = List(ACC, ACD, ADC, ADD, BCC, BCD, BDC, BDD)
여기 가지 추한 및 만 세 자리 숫자의 시퀀스 작동합니다. 어떤 시퀀스 길이에 대한 동일한 결과를 얻을 수있는 방법이 있습니까?
해결법
-
==============================
1.다음 제안은를위한 이해를 사용하지 않습니다. 그러나 나는 당신이 눈치 당신이 당신의 직교 제품의 특정 길이로 묶여있을 것입니다 있기 때문에, 결국 좋은 아이디어라고 생각하지 않습니다.
다음 제안은를위한 이해를 사용하지 않습니다. 그러나 나는 당신이 눈치 당신이 당신의 직교 제품의 특정 길이로 묶여있을 것입니다 있기 때문에, 결국 좋은 아이디어라고 생각하지 않습니다.
scala> def cartesianProduct[T](xss: List[List[T]]): List[List[T]] = xss match { | case Nil => List(Nil) | case h :: t => for(xh <- h; xt <- cartesianProduct(t)) yield xh :: xt | } cartesianProduct: [T](xss: List[List[T]])List[List[T]] scala> val conversion = Map('0' -> List("A", "B"), '1' -> List("C", "D")) conversion: scala.collection.immutable.Map[Char,List[java.lang.String]] = Map(0 -> List(A, B), 1 -> List(C, D)) scala> cartesianProduct("01".map(conversion).toList) res9: List[List[java.lang.String]] = List(List(A, C), List(A, D), List(B, C), List(B, D))
참고 재귀 함수는 꼬리 재귀되지 않습니다 위. 당신이 XSS에서 단일 목록을 많이하지 않는 한 XSS 짧은 것으로 이것은 문제가되지 않습니다. 결과의 크기 XSS 아닌 단일 요소의 수가 기하 급수적으로 증가하기 때문에, 경우이다.
-
==============================
2.나는이 함께 올 수 있습니다 :
나는이 함께 올 수 있습니다 :
val conversion = Map('0' -> Seq("A", "B"), '1' -> Seq("C", "D")) def permut(str: Seq[Char]): Seq[String] = str match { case Seq() => Seq.empty case Seq(c) => conversion(c) case Seq(head, tail @ _*) => val t = permut(tail) conversion(head).flatMap(pre => t.map(pre + _)) } permut("011")
-
==============================
3.난 그냥 다음과 같이 작동하는지했다
난 그냥 다음과 같이 작동하는지했다
def cross(a:IndexedSeq[Tree], b:IndexedSeq[Tree]) = { a.map (p => b.map( o => (p,o))).flatten }
너무 임의의 컬렉션에 대한 작업을 처리하고있는 $ 트리 유형이 표시되지 않습니다 ..
from https://stackoverflow.com/questions/8217764/cartesian-product-of-two-lists by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 왜 하나는 해시 대신 점으로 스칼라 형 멤버를 선택 하는가? (0) | 2019.11.09 |
---|---|
[SCALA] 스칼라 케이스 클래스에 업데이트 작업 (0) | 2019.11.09 |
[SCALA] 자바 8 스트림, 점점 머리와 꼬리 (0) | 2019.11.09 |
[SCALA] 자바 8 스트림 API와 정수의 목록을 셔플 (0) | 2019.11.09 |
[SCALA] 스칼라에서 제네릭 형식에 대한 패턴 매칭 (0) | 2019.11.09 |