[英]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
,则还应该声明equals
和hashCode
与它们保持一致。 否则,某些收集方法可能行为不正确。
编辑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.