error-handling - 尝试在 optaplannercode 的实体上添加哈希码时出错
问题描述
我在 optaplanner 上练习了一个项目,我正在尝试在我的实体上添加 equals 和 hashcode。首先我添加了equals方法,它工作得很好!之后,我添加了哈希码,结果出了问题。
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
} else if (o instanceof CloudBus) {
CloudBus otherBus = (CloudBus) o;
return (capacity == otherBus.getCapacity());
} else {
return false;
}
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(capacity)
.toHashCode();
}
错误:严重:servlet [WebApp] 的 Servlet.service() 在路径 [/WebApp] 的上下文中抛出异常 [com.webapp.jersey 中规则“conflictingStartBusTooSmall”的异常执行结果:java.lang.IllegalStateException:constraintMatchTotal(com .webapp.jersey/conflictingStartBusTooSmall=-97hard/0medium/0soft) 无法将 constraintMatch (com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83435, CloudBus-17]=-1hard/0medium/0soft) 添加到它的 constraintMatchSet ([com .webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83555, CloudBus-3]=-22hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83580, CloudBus-3]=-4hard/0medium/0soft, com .webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83594, CloudBus-3]=-8hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83753,CloudBus-3]=-1hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83479, CloudBus-4]=-6hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83435, CloudBus-6]=-1hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83429, CloudBus-8]=-26hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83610, CloudBus-8]=-17hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83403, CloudBus-10]=-11hard/0medium/0soft]).] 根本原因CloudBus-8]=-26hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83610, CloudBus-8]=-17hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83403, CloudBus-10]=-11hard/0medium/0soft]).] 有根本原因CloudBus-8]=-26hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83610, CloudBus-8]=-17hard/0medium/0soft, com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83403, CloudBus-10]=-11hard/0medium/0soft]).] 有根本原因
解决方案
我认为您需要在 CloudBus 中包含另一个属性,equals()
这hashCode()
将在具有相同容量的两个不同 CloudBus 之间产生差异。一个好的候选者是公共汽车的 ID。equals()
由于 ID 是唯一的,因此在and中包含其他属性没有多大意义hashCode()
(两个不同的总线将始终不相等,无论它们是否具有相同的容量等)。
仅基于容量进行比较的问题是两个不同的总线可以相等(并且具有相同的 hashCode)。结果,您将有两个不同的约束匹配,它们是相等的,因此后一个不能添加到ConstraintMatchTotal
's中constraintMatchSet
,因为其中已经存在“相等”的约束匹配。请参阅ConstraintMatchTotal。当给出更好的格式时,从异常消息中可以明显看出这一点:
ERROR: SEVERE: Servlet.service() for servlet [WebApp] in context with path [/WebApp] threw exception [
Exception executing consequence for rule "conflictingStartBusTooSmall" in com.webapp.jersey: java.lang.IllegalStateException:
The constraintMatchTotal (com.webapp.jersey/conflictingStartBusTooSmall=-97hard/0medium/0soft)
could not add constraintMatch (com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83435, CloudBus-17]=-1hard/0medium/0soft)
to its constraintMatchSet ([
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83555, CloudBus-3]=-22hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83580, CloudBus-3]=-4hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83594, CloudBus-3]=-8hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83753, CloudBus-3]=-1hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83479, CloudBus-4]=-6hard/0medium/0soft,
--> com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83435, CloudBus-6]=-1hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83429, CloudBus-8]=-26hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83610, CloudBus-8]=-17hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83403, CloudBus-10]=-11hard/0medium/0soft
]).
] with root cause
假设所有总线具有相同的容量,突出显示的约束匹配具有与将要插入的约束匹配相同的 hashCode,因为它们具有相同的 CloudRoute 和具有相同容量的总线。
推荐阅读
- go - 我应该如何编写这个函数来返回一个指针?
- kubernetes - 部署能否确保不再有一个 pod 在运行?
- c++ - 如何从 C++ 中的不完整类派生
- html - 滚动条不显示所有内容
- python - 如何使用 Python 创建交互式热图?
- java - 如何使用 ArrayList 中的索引添加多个对象
- php - Laravel 迁移不适用于 MySQL (InnoDB)
- javascript - 根据 php 脚本中的作业订单安排 cron 作业的更好方法
- cytoscape.js - 如果添加子节点,Dagre 中的布局不显示层次结构
- reactjs - 无法使用 redux 工具包从 API 获取数据