복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.그래서 당신이 그 코드 생성기를 사용하지 않는 액세스 별도의 코드를 작성, 각 튜플 인수에 대응이 소스 코드에서 별도의 클래스로 표현되기 때문에이 일반적으로 불가능하다고 예스퍼의 의견을 공유 할 수 있습니다.

    그래서 당신이 그 코드 생성기를 사용하지 않는 액세스 별도의 코드를 작성, 각 튜플 인수에 대응이 소스 코드에서 별도의 클래스로 표현되기 때문에이 일반적으로 불가능하다고 예스퍼의 의견을 공유 할 수 있습니다.

    하지만 또 다른 가능한 솔루션을 추가 할. 당신이 당신의 튜플 항목의 입력을 보존하기를 원하지만 그렇지 않으면 더 컬렉션과 같은 유형, 어쩌면 HLists (이종 목록)에 관심이 있다면 당신을위한 것입니다. 당신은 구현 및 설명에 대한 hlist의 스칼라 구글 수 있습니다.

  6. ==============================

    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. ==============================

    7.여기에 귀하의 문제에 대해 작동 할 또 다른 솔루션입니다.

    여기에 귀하의 문제에 대해 작동 할 또 다른 솔루션입니다.

    ints zip chars zip strings zip bools map{ case (((a, b), c), d) => (a,b,c,d)}
    
  8. from https://stackoverflow.com/questions/9632094/zip-multiple-sequences by cc-by-sa and MIT license