2016-11-30 1 views
0

현재 스칼라를 배우고 있으며, 이제는 개체를 비교하기 위해 정렬 된 특성을 이해하고 있습니다. 비교의 나의 현재 이해하고있는 예를 다음스칼라 이해하기 [] 특성 비교를위한

고려,

Case I, 
class Example(var n: Int) extends Ordered[Example] { 
    // ... 
    def compare(that: Example) = 
    (this.n) - (that.n) 
} 

var obj1 = new Example(12) 
var obj2 = new Example(12) 
obj1 compare obj2 //return 0 i.e. obj1 and obj2 are equal. 

Case II, 
class Example(var m: Int, var n: Int) extends Ordered[Example] { 
    // ... 
    def compare(that: Example) = 
    (this.m * this.n) - (that.m * that.n) 
} 

var obj1 = new Example(1, 2) 
var obj2 = new Example(1, 2) 
obj1 compare obj2 //return 0 i.e. obj1 and obj2 are equal. 

Case III, 
class Example(var name: String) extends Ordered[Example] { 
    // ... 
    def compare(that: Example) = 
    this.name compare that.name 
} 

var obj1 = new Example("abc") 
var obj2 = new Example("abc) 
obj1 compare obj2 //return 0 i.e. obj1 and obj2 are equal. 


Case IV, 
class Example(var name1: String, var name2: String) extends Ordered[Example] { 
    // ... 
    def compare(that: Example) = 
    (this.name1 + this.name2) compare (that.name1+that.name2) 
} 

var obj1 = new Example("abc","def") 
var obj2 = new Example("abc","def") 
obj1 compare obj2 //return 0 i.e. obj1 and obj2 are equal. 

그래서, 내 질문입니다, 어떤 비 생성자 필드는 클래스가 있다면? 예 :

class Example(var n: Int) extends Ordered[Example] { 
    var someVar: String = "default"; 
    // ... 
    def compare(that: Example) = 
    (this.n) - (that.n) 
    //do we also need to compare someVar???? otherwise, object will have different state right?? 
} 

var obj1 = new Example(12) 
obj1.someVar = "value 1" 
var obj2 = new Example(12) 
obj2.someVar = "another value 2" 
obj1 compare obj2 //Again, return 0 i.e. obj1 and obj2 are equal. 

위의 이해가 잘못 되었다면 수정하십시오.

+0

'_ compare _ == 0'은 요소가 동일 함을 의미하지 않으며 사용 된 비교 함수가'0 '을 반환했다는 것을 의미합니다. 비교를 통해 주문의 일반적인 법칙을 확인하려면 해당 규칙을 그대로 구현해야합니다. –

답변

4

비교 방법에서는 인스턴스의 n 값만 비교합니다. 따라서 n이 같고 someVar이 다른 인스턴스는 비슷한 것으로 간주됩니다. nsomeVar을 기준으로 비교를 수행하려면 비교 방법에서 n 값과 someVar을 모두 고려하십시오. 여기

다른 예제의 문자열 비교에 고장 대체 n '사이에 동점이있을 때

class Example(var n: Int) extends Ordered[Example] { 
    var someVar: String = "default" 
    def compare(that: Example) = { 
    (this.n) - (that.n) match { 
     case 0 => this.someVar.compare(that.someVar) 
     case other => other 
    } 
    } 
} 

을 어떻게 코드이다. 문자열 인스턴스에 compare을 호출하기 만하면됩니다.

비교할 필드가 부족할 때까지 기본 입력란이 같으면 보조 입력란의 비교로 대체됩니다. , 튜플에 비교

class Example(var n: Int) extends Ordered[Example] { 
    var someVar: String = "default" 

    import scala.math.Ordered.orderingToOrdered 

    def compare(that: Example) = (this.n, this.someVar) compare (that.n, that.someVar) 
} 

이 튜플을 생성 비교하고 전화

더 관용적 인 방법은 import scala.math.Ordered.orderingToOrdered하는 것을 잊지 마십시오.

일반 정보

compare 수익률은 0 개 +는 적이 또는 - 제가 정수입니다. 이 방법으로 알고리즘은 순서 특성을 구현하는 객체 모음의 순서를 파악할 수 있습니다. Ordered trait을 확장하고 compare 메소드에서 반환 된 정수를 기반으로하는 두 인스턴스를 비교할 때 알고리즘은 정렬 또는 정렬하는 동안 특정 유형의 인스턴스를 먼저 배치해야하는지 알 수 있습니다. 이는 정렬을위한 Scala 컬렉션에서 매우 일반적입니다. 방법을

scala> case class A(a: Int) extends AnyVal with Ordered[A] { override def compare(that: A): Int = this.a - that.a } 
defined class A 

공지 정렬 순서를 비교

스칼라 REPL

통지, 그 오름차순.

scala> List(A(1), A(2)).sorted 
res4: List[A] = List(A(1), A(2)) 

이제는 뺄셈 결과를 부정의 결과로 되돌려 보내고, 이제는 순서가 바뀌어 질 것입니다.순서

scala> List(A(1), A(2)).sorted 
res5: List[A] = List(A(2), A(1)) 

비교 0을 반환하는 경우 오브젝트가 동일한 것을 의미하지 않는다는 것을주의를 반대

scala> case class A(a: Int) extends AnyVal with Ordered[A] { override def compare(that: A): Int = - (this.a - that.a) } 
defined class A 

알 수 있습니다. 정렬 또는 정렬하는 동안 객체가 동일하지 않은 경우 compare 메소드에서 0을 반환 할 수 있습니다.

+0

대단히 감사합니다. 그리고 이것이 훌륭한 설명이라고 말해야합니다. 당신의 대답은 많은 것을 이해하는데 도움이되었습니다. [] 특성과 많은 새로운 개념을 배웠습니다. "scala.math.Ordered.orderingToOrdered". –

관련 문제