2017-03-07 2 views
0

List 데이터 유형을 기반으로 일부 변환 집합을 수행해야하는 요구 사항이 있습니다. 내가 List[String]을 얻는다면 나는 약간의 변형을 적용 할 필요가 있다고 말하지만, 만약 내가 List[Int]을 얻으려면 몇 가지 다른 변형이 적용될 필요가있다. 내가 List[Any] 걸릴 것입니다 함수를 정의했다 및 일치 성명을 데이터 형식을 확인해야합니다. 나는 isInstanceOf을 사용하려고했지만 제대로 작동하지 않았습니다.목록에서 데이터 유형을 찾습니다.

List의 데이터 유형을 어떻게 확인할 수 있습니까?

+0

코드를 게시를하면 무엇을 시도했다 사용을 표시합니다. 간단히 말하자면, 단순한 타입 템플릿을 사용하여 할 수 있으며, 더 강력한 것을 필요로한다면 '고양이'나 'Scalaz'로 모나드 적으로 할 수도 있습니다. – sebszyller

+0

반사가 없으면 추악하고 느립니다. 유형 정보는 [ADT] (http://typelevel.org/blog/2014/11/10/why_is_adt_pattern_matching_allowed.html) 또는 [HLists] (https://github.com/milessabin)에서 캡처해야합니다. /shapeless/wiki/Feature-overview:-shapeless-2.0.0#polymorphic-function-values) – Reactormonk

답변

2

목록은 모든 요소에 같은 유형이 있다고 가정하고이 같은 것을 할 수있는 일반 스칼라를 사용하여 :

def test(list: List[Any]): List[Any] = { 
    if(list.isEmpty) return List() 
    list.head match { 
    case a: String => list.map(str => str.asInstanceOf[String]+"3") 
    case a: Int => list.map(int => int.asInstanceOf[Int]+3) 
    } 
} 

그것은 최선의 해결책이 아니다,하지만 난 아무것도 다른 표시되지 않는 당신을

:

여기

당신이 목록의 모든 요소에 동일한 유형이 필요 물론 당신이 함수에 넣었습니다 정확히 동일한 유형을 반환 할 수 있습니다, 심지어 괴상 솔루션이며, 다른 라이브러리없이 사용할 수 있습니다

def test[T](list: List[T]): List[T] = { 
    if(list.isEmpty) return List() 
    list.head match { 
    case a: String => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T]) 
    case a: Int => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T]) 
    } 
} 

test(List("123","123")) // res0: List[String] = List(1233, 1233) 
test(List(1,2,3)) // res1: List[Int] = List(4, 5, 6) 

그리고 다시 편집, 마지막으로,이 같은 유형의 삭제를 방지하고 목록 유형을 확인 TypeTag를 사용할 수 있습니다

def test1[T: TypeTag](list: List[T]): List[T] = typeOf[T] match { 
    case t if t =:= typeOf[String] => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T]) 
    case t if t =:= typeOf[Int] => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T]) 
    case _ => list 
} 

test1(List("123", "123", "123")) // Strings so: res0: List[String] = List(1233, 1233, 1233) 
test1(List("123","123", 1)) // Oh-oh we have not defined type, so: res1: List[Any] = List(123, 123, 1) 
test1(List(1,2,3)) // And here we have res2: List[Int] = List(4, 5, 6) 
+0

덕분에 ... 부분적으로 내 문제를 해결했습니다. –

+1

@ishan 문제 없습니다. 문제의 두 번째 부분이 보이지 않습니다. 귀하의 질문,하지만 난 당신이 대답을 찾을 희망 :) –

관련 문제