3

オブジェクトを利用する Android アプリケーションを開発していScanResultます。このオブジェクトの形式は次のとおりです。

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

、、、および属性のみequals()を比較するために、メソッドを拡張する顧客クラスを作成せずにメソッドのみをオーバーライドするにはどうすればよいですか? つまり、メソッドで属性を削除して、これら 2 つのオブジェクトを比較すると、メソッドが値を返すようにする必要があります。SSIDBSSIDcapabiltieslevelfrequencyequalstimestampequals()true

[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

4

4 に答える 4

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
}
于 2013-04-08T18:21:34.647 に答える
1

これはオーバーライドされた equals() メソッドです....

@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;
    }
}
于 2013-04-08T18:22:45.987 に答える