[SCALA] 우편 번호에 여러 시퀀스
SCALA우편 번호에 여러 시퀀스
나는 오랫동안 튜플을 형성 우편 여러 시퀀스에 노력하고 있습니다 :
val ints = List(1,2,3)
val chars = List('a', 'b', 'c')
val strings = List("Alpha", "Beta", "Gamma")
val bools = List(true, false, false)
ints zip chars zip strings zip bools
내가 무엇을 얻을 :
List[(((Int, Char), String), Boolean)] =
List((((1,a),Alpha),true), (((2,b),Beta),false), (((3,c),Gamma),false))
그러나 나는 평면 튜플의 순서를 좀하고 싶습니다 :
List[(Int, Char, String, Boolean)] =
List((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))
내가 지금 할 수있다 :
List(ints, chars, strings, bools).transpose
그러나 약하게 목록 [목록 [모든]]를 입력 돌려줍니다. 또한 나는 단지 2 - 튜플, 3 튜플에 (의 int, 문자, 문자열) .zip입니다 만, 압축 작업을 할 수 있습니다.
쉽게 동일한 길이의 서열의 지퍼 (임의) 수있는 방법이 있는가?
해결법
-
==============================
1.여기에 귀하의 예를 해결하는 한 가지 방법은, 그러나이 시퀀스의 임의의 번호를하지 않습니다.
여기에 귀하의 예를 해결하는 한 가지 방법은, 그러나이 시퀀스의 임의의 번호를하지 않습니다.
val ints = List(1,2,3) val chars = List('a', 'b', 'c') val strings = List("Alpha", "Beta", "Gamma") val bools = List(true, false, false) val input = ints zip chars zip strings zip bools // Flattens a tuple ((A,B),C) into (A,B,C) def f2[A,B,C](t: ((A,B),C)) = (t._1._1, t._1._2, t._2) // Flattens a tuple ((A,B),C,D) into (A,B,C,D) def f3[A,B,C,D](t: ((A,B),C,D)) = (t._1._1, t._1._2, t._2, t._3) input map f2 map f3
나는 적어도 이러한 유형의 솔루션으로, 임의의 길이의 튜플을 위해 일반적으로 그것을 할 수 있다고 생각하지 않습니다. 튜플은 강력한 형식이며, 타입 시스템은 불가능 임의의 길이의 튜플 소요 F2 및 F3의 일반화 된 버전을 할 수있는, 당신은 내가 아는 한, 형식 매개 변수의 변수 번호를 지정할 수 없습니다 ((A, B), C, D ...) (즉 튜플을 반환 (A, B, C, D ...)).
형식 매개 변수의 변수 번호를 지정하는 방법이 있다면, 우리는 특성 Tuple1, Tuple2을 필요로하지 않을 ... 스칼라의 표준 라이브러리에서 Tuple22.
-
==============================
2.나는 데이터 세트를 나타내는 클래스를 만들 것입니다 :
나는 데이터 세트를 나타내는 클래스를 만들 것입니다 :
case class DataSet(int: Int, char: Char, string: String, bool: Boolean)
이것은 우리가 튜플에있는 대신 _N의 값을 액세스하기위한 더 좋은 이름을 제공합니다. 목록 다른 크기를 가질 수 있다면 짧은 선택해야합니다 :
val min = List(ints, chars, strings, bools).map(_.size).min
이제 데이터를 추출 할 수 있습니다 :
val dataSets = (0 until min) map { i => DataSet(ints(i), chars(i), strings(i), bools(i)) }
원래 목록 값이 많이 포함 할 때의 액세스 시간은 O (1)되도록 IndexedSeq로 확인하는 것이 좋습니다.
-
==============================
3.나는 패턴 매칭이 좋은 옵션이라고 생각
나는 패턴 매칭이 좋은 옵션이라고 생각
val ints = List(1,2,3) val chars = List('a', 'b', 'c') val strings = List("Alpha", "Beta", "Gamma") val bools = List(true, false, false) (ints zip chars zip strings zip bools) map { case (((i,c),s),b) => (i,c,s,b)} **res1: List[(Int, Char, java.lang.String, Boolean)] = List((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))**
또는 당신은 유형을뿐만 아니라 추가 할 수 있습니다
(ints zip chars zip strings zip bools) map {case (((i:Int,c:Char),s:String),b:Boolean) => (i,c,s,b)} **res2: List[(Int, Char, java.lang.String, Boolean)] = List((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))**
-
==============================
4.볼품를 사용하여, 당신은 할 수 있습니다 :
볼품를 사용하여, 당신은 할 수 있습니다 :
import shapeless.Tuples._ val ints = (1, 2, 3) val chars = ('a', 'b', 'c') val megatuple = (ints, chars) val megahlist = (megatuple hlisted) map hlisted val transposed = (mhlist transpose) map tupled tupled scala> transposed res: ((Int, Char), (Int, Char), (Int, Char)) = ((1,a),(2,b),(3,c))
(이 있는지 확실하지, 더 implicts 당신이지도와 앞뒤로 변환을 방지 할 수있는 정의)
[편집 :이 부분은 더 이상 사실이 아니다.
참고는 볼품 워드 프로세서 말하는 것으로, Tuple4 만 변환까지 현재 지원됩니다. 수동으로 다음 HLists을 만들어야 할 것입니다.]
-
==============================
5.그래서 당신이 그 코드 생성기를 사용하지 않는 액세스 별도의 코드를 작성, 각 튜플 인수에 대응이 소스 코드에서 별도의 클래스로 표현되기 때문에이 일반적으로 불가능하다고 예스퍼의 의견을 공유 할 수 있습니다.
그래서 당신이 그 코드 생성기를 사용하지 않는 액세스 별도의 코드를 작성, 각 튜플 인수에 대응이 소스 코드에서 별도의 클래스로 표현되기 때문에이 일반적으로 불가능하다고 예스퍼의 의견을 공유 할 수 있습니다.
하지만 또 다른 가능한 솔루션을 추가 할. 당신이 당신의 튜플 항목의 입력을 보존하기를 원하지만 그렇지 않으면 더 컬렉션과 같은 유형, 어쩌면 HLists (이종 목록)에 관심이 있다면 당신을위한 것입니다. 당신은 구현 및 설명에 대한 hlist의 스칼라 구글 수 있습니다.
-
==============================
6.제품 컬렉션을 사용하여
제품 컬렉션을 사용하여
scala> ints flatZip chars flatZip strings flatZip bools res0: org.catch22.collections.immutable.CollSeq4[Int,Char,String,Boolean] = CollSeq((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))
이 기능은 현재 인수에 대응 한 작동 - 당신은 유형이 보존되어 볼 수 있습니다 (22)으로.
-
==============================
7.여기에 귀하의 문제에 대해 작동 할 또 다른 솔루션입니다.
여기에 귀하의 문제에 대해 작동 할 또 다른 솔루션입니다.
ints zip chars zip strings zip bools map{ case (((a, b), c), d) => (a,b,c,d)}
from https://stackoverflow.com/questions/9632094/zip-multiple-sequences by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 스칼라 미래에 던져 예외를 잡아합니까? (0) | 2019.11.23 |
---|---|
[SCALA] 스칼라에서 합성 클래스로 싱글 톤? (0) | 2019.11.23 |
[SCALA] 슬라이스 배열 방법 및 열의 합 요소? (0) | 2019.11.23 |
[SCALA] 스칼라 스파크 : 분할 수집 여러 RDD로? (0) | 2019.11.23 |
[SCALA] 스칼라는 : 어떻게 어떤 경우 클래스의 추상 복사 가능한 슈퍼 클래스를 정의? (0) | 2019.11.23 |