2013-04-08 3 views
2

ScanResult 객체를 사용하는 Android 애플리케이션을 개발 중입니다. 이 객체의 형태 :자바 객체의 equals() 메소드를 오버라이드합니다.

[SSID: __mynetwork__, BSSID: 00:0e:2e:ae:4e:85, capabilities: [WPA-PSK-TKIP][ESS], level: -69, frequency: 2457, timestamp: 117455824743] 

어떻게 만 SSID, BSSID, capabilties, levelfrequency 속성만을 비교하기 위해 그것을 확장하는 고객 클래스를 생성하지 않고 단지 equals() 메소드를 오버라이드 (override) 할? 즉, equals 방법 나는이 두 개체를 비교하면, equals() 방법은 true 값을 반환 있도록 timestamp 속성을 제거하려면 :

[SSID: __mynetwork__, BSSID: 00:0e:2e:ae:4e:85, capabilities: [WPA-PSK-TKIP][ESS], level: -69, frequency: 2457, timestamp: 117455824743] 
[SSID: __mynetwork__, BSSID: 00:0e:2e:ae:4e:85, capabilities: [WPA-PSK-TKIP][ESS], level: -69, frequency: 2457, timestamp: 117460312231] 

참고 : 나는 고객이 도출 내가 생성자 구현하려고 할 때 ScanResult 나는 다음과 같은 오류가 확장 클래스 : The constructor ScanResult() is not visible

+1

오버라이드하고 타임 스탬프 검사를 제공하지 말고 그냥 둡니다. –

+0

equals 메서드를 확장하는 사용자 정의 클래스를 만들까요? – user1135357

+0

문제는 확장하는 새 클래스를 만들지 않고 해당 메서드를 재정의 할 수 있는지 여부입니다. – user1135357

답변

1

ScanResult 클래스를 확장 만 equals() 메소드를 오버라이드 (override)를

class CustomScanResult extends ScanResult { 

    @Override 
    public boolean equals(Object o) { 
     // ... custom logic ... 
    } 

} 
+0

해시 코드를 잊지 마세요! ;-) – Cygnusx1

4

무시하려는 필드를 확인하지 않고 구현하면됩니다. hashode()도 재정의하는 것을 잊지 마십시오.

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
      + ((field1 == null) ? 0 : field1.hashCode()); 
    result = prime * result + ((field2 == null) ? 0 : field2.hashCode()); 
      ...etc 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    ScanResult other = (ScanResult) obj; 
    if (field1 == null) { 
     if (other.field1 != null) 
      return false; 
    } else if (!field1.equals(other.field1)) 
     return false; 
    if (field2 == null) { 
     if (other.field2 != null) 
      return false; 
    } else if (!field2 .equals(other.field2)) 
     return false; 
     } 
... etc 
} 
1

이것은 당신의 오버라이드 (override) 동등하다() 메소드 ....

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (!(o instanceof ScanResult)) return false; 

    if(!BSSID.equals(o.BSSID)) return false; 
    if(!SSID.equals(o.SSID)) return false; 
    if(!capabilities.equals(o.capabilities)) return false; 
    if(frequency != o.frequency) return false; 
    if(level != o.level) return false; 

    return true; 
} 

편집

지금 위의 솔루션이 작동하지 않는 것을, 나는 제안 할 수 있습니다 :

class ScanResultComparator { 
    public static boolean equals(ScanResult a, ScanResult b){ 
     if(!a.BSSID.equals(b.BSSID)) return false; 
     if(!a.SSID.equals(b.SSID)) return false; 
     if(!a.capabilities.equals(b.capabilities)) return false; 
     if(a.frequency != b.frequency) return false; 
     if(a.level != b.level) return false; 

     return true; 
    } 
} 
+0

나는 모두가 하나의 "if"블록에 있어야한다고 생각합니다. 예 : if (! a.BSSID.equals (b.BSSID) ||! a.SSID.equals (b.SSID) ...) { – Hatim

관련 문제