我想基于 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
您还应该声明 equals
和hashCode
与他们保持一致。否则某些收集方法可能会出现错误。
编辑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/