首页 > 解决方案 > 尝试在 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]).] 有根本原因

标签: error-handlingdroolsequalshashcodeoptaplanner

解决方案


我认为您需要在 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 和具有相同容量的总线。


推荐阅读