2016-05-31 3 views
0

목록의 항목을 num에 얼마나 가깝게 정렬하여 목록을 정렬하려고합니다. `_`에 대한 매개 변수 유형이 누락되었습니다.

내가 사용 sortWith을 시도하기로 결정하지만, 다음 코드는 :
list.sortWith(math.abs(_ - num) < math.abs(_ - num)) 

스칼라에서 _에 대한 매개 변수 유형을 누락하지 못했습니다. 목록의 유형은 List[Int]입니다.

는 다른 스레드에 따라, 나는 _ 어떻게 든 모호한 입력되는 것을 알지만, 왜 (왜 다음 코드는 모호한 입력되지 않음) 확실하지 않다 :

scala> val sortedDudes = dudes.sortWith(_.name < _.name) 
sortedDudes: Array[Person] = Array(Al, Paul, Tyler) 

(Source)

+0

코드 자체를 포함하십시오. 'list'와'num'은 무엇입니까? – Jubobs

+0

list는 임의의 List [Int]이고, num은 정수입니다. – dcheng

+1

'math.abs (_ - num)'은'math.abs (x => x-num)'의 줄임말로 항상 의미가 있습니다. 예정된. –

답변

3
def foo = { 
    val num = 2 
    val list: List[Int] = List(1, 2) 
    list.sortWith((a, b) => math.abs(a - num) < math.abs(b - num)) 
    } 

완벽하게 작동합니다. 그것은 scala가 math.abs에서 sortWith

1

이 아닌 _을 얻으려고 시도하기 때문입니다. 스칼라에서 _은 다른 상황을 위해 다양한 상황에서 사용될 수 있습니다. this question에 대한 답변은 그 중 일부를 명확하게 설명하는 데 도움이됩니다.

질문으로 돌아가서, OP가 매개 변수 교체를 위해 _을 사용하려고합니다. 다음 예

List(1,2,5,7).filter(_ > 4) 
여기

filter을 고려하여 종류 A => Unit하는 기능을 걸리므 위에서 밑줄은 하나 개 이상의 매개 변수에 대해 견딜 수

List(1,2,5,7).filter(x => x > 4) 

속기 있지만 지칭하는데 사용되어야 각 매개 변수에 정확히 한 번. 이것이 OP의 sortedDudes 스 니펫이 작동하는 이유입니다. 그러므로 다음은 합법적입니다. 속기는

List(1,2,5,7).reduce(_ + _) 

List(1,2,5,7).reduce((a,b) => a + b) 

내가 원래 조각에 문제가 sortWith 방법으로 필요에 따라 컴파일러가 명확 유형 (A, A) => Boolean의 무언가로 그것을 분석 할 수 있다는 것입니다 생각합니다. 컴파일러에게 다음과 같이 약간의 도움을 줄 수 있습니다.

scala> def op(int: Int, num: Int) = math.abs(int - num) 
op: (int: Int, num: Int)Int 

scala> List(1,7,5,10).sortWith(op(_, 5) < op(_, 5)) 
res0: List[Int] = List(5, 7, 1, 10) 
관련 문제