2016-12-02 9 views
1

은 내가 우아하게 모델링하는 방법을 잘 모르겠어요 다음과 같은 문제가 내가 각 조합에 대한 값을 생성 할 C의 인스턴스을 감안할 때중첩 된 개체의 모든 조합을 반복하는 방법은 무엇입니까? <p></p> 나는 다음과 같은 클래스를 가지고 말 :

class A(v: String) 
class B(v: String, as: Seq[A]) 
class C(v: String, bs: Seq[B]) 

C x B x AC 인스턴스에 B이 없거나 B 인스턴스에 A이없는 경우에도 값을 생성하려고합니다.

간단하게하기 위해 내가 생산하고자하는 값이 c.v - b.v - a.v 형태의 문자열이라고합시다.

def produce(c: C): List[String] = ??? 

있도록 : :이 보내고 이해뿐만 flatMap부터 사용 achiving 시도

val c1 = new C(v = "c1", bs = Seq.empty) 
produce(c1) // List("c1 - - ") 

val c2 = new C(
    v = "c1", 
    bs = Seq(new B(v = "b1", as = Seq.empty), new B(v = "b2", as = Seq.empty)) 
) 

produce(c2) // List("c1 - b1 - ", "c1 - b2 - ") 


val c3 = new C(
    v = "c1" 
    bs = Seq(
    new B(v = "b1", as = Seq(new A("a1"), new A("a2))) 
    new B(v = "b2", as = Seq(new A("a3"), new A("a4))), 
) 
) 

produce(c3) // List("c1 - b1 - a1", 
      //  "c1 - b1 - a2", 
      //  "c1 - b2 - a3", 
      //  "c1 - b2 - a4") 

- 즉

나는 다음과 같은 방법을 구현하는 방법을 찾고 있어요 비어있는 Seq 위에는 비어있는 것들로 Seq을 비워야 만하는 값이 생성되지 않습니다. 코드는 복잡하고 오래되었습니다.

제 질문은 이것을 수행하는 가장 좋은 방법입니다. 이 작업을 단순화하는 데 도움이되는 데이터 구조가 있습니까?

감사합니다.

+0

as/bs 시퀀스를 통해 패턴 일치를 시도하고 빈/비어 있지 않은 경우에 해당하는 동작을 구현할 수 있습니다. – jarandaf

+0

@ jarandaf ok 제 말은 당신이 의미하는 바를 이해한다고 생각하지만, 중첩 된 이해력 (또는 단순히 'flatMap's)과 패턴 수학의 결과를 가져올 것이라고 생각합니다. 그것은 작동하지만, 나는 좀 더 elegane \ idiomatic (특히 네가 3 개의 네 스팅을 가지고 있다면)을 찾고있다. – Dani

+0

출력 ""c1 - - "'는'C'가 얼마나 많은 중첩 된 레벨이 그 아래에 있는지를 알고 있다고 가정합니다. 저거 알려진거야? – maasg

답변

2

나는 이것이 당신이 무엇을하는지에 관해 생각합니다. 클래스를 케이스 클래스로 바꾸어 패턴 일치를 쉽게했습니다.

sealed abstract class VSet 
case class A(v: String) extends VSet 
case class B(v: String, as: Seq[A]) extends VSet 
case class C(v: String, bs: Seq[B]) extends VSet 

def produce(vset: VSet, prefix: String = ""): Seq[String] = vset match { 
    case C(v, bs) => if (bs.isEmpty) Seq(s"$v -") 
        else bs.flatMap(produce(_, s"$v => ")) 
    case B(v, as) => if (as.isEmpty) Seq(s"$prefix$v -") 
        else as.flatMap(produce(_, s"$prefix$v => ")) 
    case A(v) => Seq(s"$prefix$v") 
} 
관련 문제