java - 为多个字段实现compareTo方法

标签 java

我想基于 5 元组比较两个对象,它们是: srcAddr、dstAddr、srcPort、dstPort、协议(protocol)

这是我所拥有的:

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;
}

}

但是这不起作用。它说不能比较两个字符串。 谁能帮助我知道问题是什么? 谢谢。

最佳答案

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

但是解决这个问题并没有真正的帮助,因为你的代码没有像正确实现的 compareTo 那样做任何事情。方法应该做。

compareTo 的直接实现为您Flows类将是:

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)处理空值并将其应用于上面的每个字段的方法。

编辑

鉴于您正在定义 compareTo您还应该声明 equalshashCode与他们保持一致。否则某些收集方法可能会出现错误。

编辑2

您在 how to override compareTo method 的评论中提到的编译器错误发生的原因是 int compareTo(Flow flow)方法实际上实现了Comparable<Flow>的compareTo方法。如果您要申报Flow实现原始接口(interface)类型 Comparable那么签名需要是

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

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

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

关于java - 为多个字段实现compareTo方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449765/

相关文章:

java - 位级操作,从short值中获取位

java - 如何让 axis/axis2 为生成的类生成 toString 方法?

java - 从哪里下载 sajdbc4.jar?

java - 使通过 SOAP 发送的对象的方法可见

java - 合并 word(docx) 文档与 DOCX4J : how to copy images?

java - Log4j2 没有记录到控制台

java - ElasticSearch 中的嵌套搜索不起作用?

java - 按键事件未运行

java - 简单的数学题?

java - 密码解密结果错误