繁体   English   中英

为多个字段实现compareTo方法

[英]implementing compareTo method for several fields

我想比较两个基于5元组的对象:srcAddr,dstAddr,srcPort,dstPort,协议

这是我所拥有的:

public class Flows implements Serializable, Comparable {

String srcAddr, dstAddr, srcPort, dstPort, protocol;

public int compareTo(Flows arg0) {
    if(this.srcAddr == arg0.srcAddr &&
        this.dstAddr == arg0.dstAddr &&
            this.srcPort == arg0.srcPort &&
                this.dstPort == arg0.dstPort &&
                    this.protocol == arg0.protocol)
                        return 0;
}

}

但这是行不通的。 它说不能比较两个字符串。 谁能帮我知道问题在哪里吗? 谢谢。

编译器/代码检查器警告您,将String值与==进行比较几乎总是一个错误。

但是修复该问题实际上并没有帮助,因为您的代码没有像正确实现的compareTo方法应该做的那样。

Flows类的compareTo直接实现是:

public int compareTo(Flows other) {
    int res = this.srcAddr.compareTo(other.srcAddr);
    if (res != 0) {
        return res;
    }
    res = this.dstAddr.compareTo(other.dstAddr);
    if (res != 0) {
        return res;
    }
    res = this.srcPort.compareTo(other.srcPort);
    if (res != 0) {
        return res;
    }
    res = this.dstPort.compareTo(other.dstPort);
    if (res != 0) {
        return res;
    }
    return this.protocol.compareTo(other.protocol);
}

假设这些字段永远不会为空。 如果是这样,则编写一个safeCompare(String, String)方法,该方法应注意使用null并将其应用于上述每个字段。

编辑

假设您正在定义compareTo ,则还应该声明equalshashCode与它们保持一致。 否则,某些收集方法可能行为不正确。

编辑2

您在注释中提到的有关如何重写compareTo方法的编译器错误是因为int compareTo(Flow flow)方法实际上实现了Comparable<Flow>的compareTo方法。 如果要声明Flow为实现原始接口类型Comparable则签名需要为

public int compareTo(Object obj) {
    Flow flow = (Flow) obj;
    ...

但是更好的解决方案是将类声明更改为:

public class Flows implements Serializable, Comparable<Flow> {
...

尝试:

@Override
public int compareTo(final Flows that) {
    return ComparisonChain.start().
        compare(this.srcAddr, that.srcAddr).
        compare(this.dstAddr, that.dstAddr).
        compare(this.srcPort, that.srcPort).
        compare(this.dstPort, that.dstPort).
        compare(this.protocol, that.protocol).
        result();
}

需要番石榴

使用string.equals()代替==。

您也可以这样写,我在项目中做过这样的事情

public int compareTo(Flows arg0) {
    int comp1, comp2, comp3, comp4;
    comp1 = this.srcAddr.compareTo(arg0.srcAddr);
    comp2 = this.dstAddr.compareTo(arg0.dstAddr);
    comp3 = this.srcPort.compareTo(arg0.srcPort);
    comp4 = this.protocol.compareTo(arg0.protocol);

    if (comp1 == 0 && comp2 == 0 && comp3 == 0 && comp4 == 0) {
        return 0;
    } else {

        if (comp1 != 0)
            return comp1;
        else {
            if (comp2 != 0)
                return comp2;
            else {
                if (comp3 != 0)
                    return comp3;
                else {
                    if (comp4 != 0)
                        return comp4;
                    else
                        return 0;
                }
            }
        }

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM