2014-07-10 3 views
0

튜플을 생성해야하지만이 튜플의 크기는 변수 값에 따라 런타임에 변경해야합니다. 나는 스칼라에서 그렇게 할 수 없다. 그래서 배열을 만들었습니다 :가변 길이의 배열을 스칼라에서 튜플로 변환

val temp:Array[String] = new Array[String](x) 

어떻게 배열을 튜플로 변환합니까? 이것이 가능한가? 나는 초보자입니다.

+0

이 크기 런타임에 달라질 수있는 유일한인가


당신이 애호가 얻고 싶은 경우에, 당신은 .toTuple 방법을 정의 할 수 있습니다? 튜플에있는 항목의 유형은 어떻습니까? 당신의 예제에서 제시하는 것처럼 항상 'String'이 될 것입니까? – vptheron

+2

튜플은 정의상 이질적 요소 고정 된 것입니다. 동적 수의 문자열이 필요하면 모든 유형의 컬렉션을 사용할 수 있습니다. 왜 그것을 "튜플"로 변환하고 싶습니까? –

+0

다른 클래스의 메서드에 튜플을 공급해야하기 때문에 튜플이 필요합니다. 컨트롤을 사용할 수 없습니다. 예, 튜플의 타입은 String입니다. – user2773013

답변

2

튜플을 만들려면 원하는 크기를 알아야합니다.

val temp = Array("1", "2") 
val tup = temp match { case Array(a,b) => (a,b) } 
// tup: (String, String) = (1,2) 

def expectsTuple(x: (String,String)) = x._1 + x._2 
expectsTuple(tup) 

을 그리고 당신이 함수가 기대대로에 튜플을 전달할 수 있습니다 : 당신이이 가정에, 당신은 같은 것을 할 수 있습니다.

implicit class Enriched_toTuple_Array[A](val seq: Array[A]) extends AnyVal { 
    def toTuple2 = seq match { case Array(a, b) => (a, b); case x => throw new AssertionError(s"Cannot convert array of length ${seq.size} into Tuple2: Array(${x.mkString(", ")})") } 
    def toTuple3 = seq match { case Array(a, b, c) => (a, b, c); case x => throw new AssertionError(s"Cannot convert array of length ${seq.size} into Tuple3: Array(${x.mkString(", ")})") } 
    def toTuple4 = seq match { case Array(a, b, c, d) => (a, b, c, d); case x => throw new AssertionError(s"Cannot convert array of length ${seq.size} into Tuple4: Array(${x.mkString(", ")})") } 
    def toTuple5 = seq match { case Array(a, b, c, d, e) => (a, b, c, d, e); case x => throw new AssertionError(s"Cannot convert array of length ${seq.size} into Tuple5: Array(${x.mkString(", ")})") } 
} 

이 당신이 할 수 있습니다 :

val tup = temp.toTuple2 
// tup: (String, String) = (1,2) 
관련 문제