2016-10-31 2 views
1

스칼라 병합에 대한 도움이 필요합니다.문자열 및 목록의 스칼라 병합 목록 [String]

나는 StringList[String]의 목록이 있습니다.

예 : List("I", "can't", List("do", "this"))

기대 결과 :

val flattenList = list.flatten { 
    case list: List[Any] => list 
    case x => List(x) 
} 

하지만 이해하기가 매우 까다 롭고 어려운 것 같다 List("I", "can't", "do", "this")

나는이 실험의 많은, 가장 컴팩트 한 솔루션 짓을했는지는 . 더 순진한 코드에 대한 제안?

감사합니다.

+0

http://stackoverflow.com/questions/1737452/how-to-flatten-a-list-of-different-types-in-scala – dkolmakov

+0

'list.flatten'을 사용해 보셨습니까? 그렇다면 왜 그것이 당신을 위해 작동하지 않았습니까? – maasg

+0

@maasg :'flatten'은리스트가 다른 데이터 타입을 포함하고 있기 때문에 작동하지 않습니다. String과 List [String] – Shankar

답변

1

나는 두 가지 경우를 다루는 것을 피할 수 있다고 생각하지 않는다 : 단일 요소 대리스트. 한 가지 방법이나 다른 방법을 사용하면 프로그램에 무엇을해야하는지 알릴 수 있습니다.

def flattenList(xs: List[Any]): List[Any] = 
    xs match { 
    case Nil => Nil 
    case (ys:List[_]) :: t => flattenList(ys) ::: flattenList(t) 
    case h :: t => h :: flattenList(t) 
    } 

예 :

scala> flattenList(List("I", "can't", List("do", "this"))) 
res1: List[Any] = List(I, can't, do, this) 

scala> flattenList(List("I", "can't", List("do", List("this", "and", "this")))) 
res2: List[Any] = List(I, can't, do, this, and, this) 

이 보이지 않는 매우하지만 안전 입력 여기에 어떤 깊이의 목록을 다루는보다 일반적인 구현이다. 나무 또는 다른 것을 사용하십시오.

3

같은 목록에 다른 유형의 믹싱 요소가있는 것은 "까다롭고 이해하기 어렵습니다. 그것이 문제의 근본 원인입니다. 일단 당신이 그것을 가지고 있다면, 그 목록을 스캔하고, 각 요소의 유형을 검사하여 그것을 고치기위한 방법이 없으며, 당신의 해결책은 다른 것에서 제안 된 것보다 확실히 좋다. 대답 :)).

내가 당신이라면 처음에는 이런 이질적인 목록을 갖는 코드 경로를 다시 생각해 볼 수 있습니다. 이 방법으로 유형 안전을 파괴하고 결국 List[AnyRef]으로 끝나기 때문에 이것은 좋은 접근법이 아닙니다.

+0

예. 네가 옳아. 나는 스칼라가 처음이다. 때때로 언어의 기능은 단지 작동하기 때문에 나쁜 해결책으로 이끈다. 그러나이 경우에는 리팩토링을 시작해야한다. 고맙습니다. – antonkw

+0

정확히 내 생각. 나는 +1하는 유혹에 빠지지만 엄밀히 말하자면 이것은 대답보다 더 많은 코멘트입니다. – maasg

+0

@maasg 답변입니다. 알겠습니다. 문제는 OP가 가진 것보다 평평하게하는 것이 더 좋은 방법인지 여부였다. 내 대답은 아니오 야". :) – Dima

관련 문제