对象未被识别为集合的一部分
Object isn't recognized as part of collection
我正在尝试创建一个脚本,该脚本将 XML 中的元素收集到列表中,并验证特定对象是该列表的一部分。请在下面找到我的脚本:
class BaggageEntitlement{
String allowancePieces
String ruleType
String ruleId
String passengerNameRef
String segmentNumber
boolean equals(BaggageEntitlement that) {
return (
this.allowancePieces.equals(that.allowancePieces) &&
this.ruleType.equals(that.ruleType) &&
this.ruleId.equals(that.ruleId) &&
this.passengerNameRef.equals(that.passengerNameRef) &&
this.segmentNumber.equals(that.segmentNumber)
)
}
}
ArrayList<BaggageEntitlement> expectedEntitlements = new ArrayList<BaggageEntitlement>()
ArrayList<BaggageEntitlement> actualEntitlements = new ArrayList<BaggageEntitlement>()
BaggageEntitlement segment1Entitlement = new BaggageEntitlement(allowancePieces : '2', ruleType : 'OVERRIDE', ruleId : '15483', passengerNameRef: '01.01', segmentNumber: '1')
def cbfNode = new XmlSlurper().parseText(messageExchange.getResponseContentAsXml()).Body.CalculateBagFeesRS
def baggageEntitlementNode = cbfNode.AncillaryOffers.Itinerary.BaggageEntitlements
baggageEntitlementNode.EntitlementItineraryPart.each{
def baggageAllowanceEntitlementNode = it.BaggageAllowanceEntitlement
BaggageEntitlement baggageEntitlement = new BaggageEntitlement()
baggageEntitlement.allowancePieces = baggageAllowanceEntitlementNode.MaxPieces.text().toString()
baggageEntitlement.ruleType = baggageAllowanceEntitlementNode.@ruleType.toString()
baggageEntitlement.ruleId = baggageAllowanceEntitlementNode.@ruleId.toString()
baggageEntitlement.passengerNameRef = it.PassengerReference.@nameReferenceNumber.toString()
baggageEntitlement.segmentNumber = airIdToSegmentNumber[it.SegmentReference.@segmentNumber.toString()]
actualEntitlements.add(baggageEntitlement)
}
但是在创建集合后,存在于创建的集合中的对象不会被识别为集合的一部分。我创建了以下代码来演示这一点:
println "Is iterator in collection: ${actualEntitlements.contains(segment1Entitlement)}"
println "Is object equals (I) to iterator: ${actualEntitlements[0] == segment1Entitlement}"
println "Is object equals (II) to iterator: " + actualEntitlements[0].equals(segment1Entitlement)
println "Is 'allowancePieces' members are equal: " + (actualEntitlements[0].allowancePieces == segment1Entitlement.allowancePieces)
println "Is 'ruleType' members are equal: " + (actualEntitlements[0].ruleType == segment1Entitlement.ruleType)
println "Is 'ruleId' members are equal: " + (actualEntitlements[0].ruleId == segment1Entitlement.ruleId)
println "Is 'passengerNameRef' members are equal: " + (actualEntitlements[0].passengerNameRef == segment1Entitlement.passengerNameRef)
println "Is 'segmentNumber' members are equal: " + (actualEntitlements[0].segmentNumber == segment1Entitlement.segmentNumber)
逐个比较对象成员的控制台输出如下所示:
Is iterator in collection: false
Is object equals (I) to iterator: true
Is object equals (II) to iterator: true
Is 'allowancePieces' members are equal: true
Is 'ruleType' members are equal: true
Is 'ruleId' members are equal: true
Is 'passengerNameRef' members are equal: true
Is 'segmentNumber' members are equal: true
你能告诉我为什么我的对象不被认为是集合的一部分,尽管每个成员都进行了成员比较 returns 'true' 吗?
因为你没有覆盖等于。您提供了具有不同签名的自己的 equals 方法。覆盖正确的 equals 方法...
public boolean equals(Object o) {
... your code here...
}
...并且集合将识别您的对象,正如 Collection.contains(...)
的集合合同
Returns true if this collection contains the specified element. More formally, returns true if and only if this collection contains at least one element e such that (o==null ? e==null : o.equals(e)).
(这里指的是正确的equals方法,而不是任何equals方法。参数必须是一个对象,否则是不同的equals方法,对你没有帮助。)
有一个像 boolean equals(BaggageEntitlement that)
这样方便的方法对于其他目的可能很好(尽管我对此表示怀疑),但不会调用此方法,因为大多数其他 类 需要一个对象而不是一个"BaggageEntitlement"。 Equals 是 Object 的基本方法之一,因此您应该始终覆盖它而不是创建自己的不同版本。
我正在尝试创建一个脚本,该脚本将 XML 中的元素收集到列表中,并验证特定对象是该列表的一部分。请在下面找到我的脚本:
class BaggageEntitlement{
String allowancePieces
String ruleType
String ruleId
String passengerNameRef
String segmentNumber
boolean equals(BaggageEntitlement that) {
return (
this.allowancePieces.equals(that.allowancePieces) &&
this.ruleType.equals(that.ruleType) &&
this.ruleId.equals(that.ruleId) &&
this.passengerNameRef.equals(that.passengerNameRef) &&
this.segmentNumber.equals(that.segmentNumber)
)
}
}
ArrayList<BaggageEntitlement> expectedEntitlements = new ArrayList<BaggageEntitlement>()
ArrayList<BaggageEntitlement> actualEntitlements = new ArrayList<BaggageEntitlement>()
BaggageEntitlement segment1Entitlement = new BaggageEntitlement(allowancePieces : '2', ruleType : 'OVERRIDE', ruleId : '15483', passengerNameRef: '01.01', segmentNumber: '1')
def cbfNode = new XmlSlurper().parseText(messageExchange.getResponseContentAsXml()).Body.CalculateBagFeesRS
def baggageEntitlementNode = cbfNode.AncillaryOffers.Itinerary.BaggageEntitlements
baggageEntitlementNode.EntitlementItineraryPart.each{
def baggageAllowanceEntitlementNode = it.BaggageAllowanceEntitlement
BaggageEntitlement baggageEntitlement = new BaggageEntitlement()
baggageEntitlement.allowancePieces = baggageAllowanceEntitlementNode.MaxPieces.text().toString()
baggageEntitlement.ruleType = baggageAllowanceEntitlementNode.@ruleType.toString()
baggageEntitlement.ruleId = baggageAllowanceEntitlementNode.@ruleId.toString()
baggageEntitlement.passengerNameRef = it.PassengerReference.@nameReferenceNumber.toString()
baggageEntitlement.segmentNumber = airIdToSegmentNumber[it.SegmentReference.@segmentNumber.toString()]
actualEntitlements.add(baggageEntitlement)
}
但是在创建集合后,存在于创建的集合中的对象不会被识别为集合的一部分。我创建了以下代码来演示这一点:
println "Is iterator in collection: ${actualEntitlements.contains(segment1Entitlement)}"
println "Is object equals (I) to iterator: ${actualEntitlements[0] == segment1Entitlement}"
println "Is object equals (II) to iterator: " + actualEntitlements[0].equals(segment1Entitlement)
println "Is 'allowancePieces' members are equal: " + (actualEntitlements[0].allowancePieces == segment1Entitlement.allowancePieces)
println "Is 'ruleType' members are equal: " + (actualEntitlements[0].ruleType == segment1Entitlement.ruleType)
println "Is 'ruleId' members are equal: " + (actualEntitlements[0].ruleId == segment1Entitlement.ruleId)
println "Is 'passengerNameRef' members are equal: " + (actualEntitlements[0].passengerNameRef == segment1Entitlement.passengerNameRef)
println "Is 'segmentNumber' members are equal: " + (actualEntitlements[0].segmentNumber == segment1Entitlement.segmentNumber)
逐个比较对象成员的控制台输出如下所示:
Is iterator in collection: false
Is object equals (I) to iterator: true
Is object equals (II) to iterator: true
Is 'allowancePieces' members are equal: true
Is 'ruleType' members are equal: true
Is 'ruleId' members are equal: true
Is 'passengerNameRef' members are equal: true
Is 'segmentNumber' members are equal: true
你能告诉我为什么我的对象不被认为是集合的一部分,尽管每个成员都进行了成员比较 returns 'true' 吗?
因为你没有覆盖等于。您提供了具有不同签名的自己的 equals 方法。覆盖正确的 equals 方法...
public boolean equals(Object o) {
... your code here...
}
...并且集合将识别您的对象,正如 Collection.contains(...)
Returns true if this collection contains the specified element. More formally, returns true if and only if this collection contains at least one element e such that (o==null ? e==null : o.equals(e)).
(这里指的是正确的equals方法,而不是任何equals方法。参数必须是一个对象,否则是不同的equals方法,对你没有帮助。)
有一个像 boolean equals(BaggageEntitlement that)
这样方便的方法对于其他目的可能很好(尽管我对此表示怀疑),但不会调用此方法,因为大多数其他 类 需要一个对象而不是一个"BaggageEntitlement"。 Equals 是 Object 的基本方法之一,因此您应该始终覆盖它而不是创建自己的不同版本。