如何在Timefold中使用Recommended Fit API将ArrayList作为fittedEntityOrElement?
解决Timefold Recommended Fit API传ArrayList报错的问题
问题根源
你把ArrayList对象直接传给了recommendFit的第二个参数,Timefold误将其当作**计划实体(Planning Entity)**处理。由于ArrayList是JDK内置类,无法添加@PlanningId注解,而Timefold需要通过该注解唯一标识实体以支持多线程求解等功能,因此触发了"无法查找externalObject"的错误。
正确解决方案
1. 配置正确的计划实体类
你的订单实体类(比如Order)必须标注@PlanningEntity,且包含一个标注@PlanningId的唯一标识字段:
@PlanningEntity public class Order { @PlanningId // 必须添加,用于唯一标识实体 private Long orderId; // 其他规划相关字段示例 @PlanningVariable(valueRangeProviderRefs = {"timeSlotRange"}) private TimeSlot assignedTimeSlot; // ... }
2. 修正recommendFit调用代码
第二个参数直接传订单实体集合(orders本身,因为List实现了Iterable),同时调整第三个映射函数的参数为单个实体对象:
// orders 为 List<Order> 类型 return solutionManager.recommendFit(planningModel, orders, // 传递订单实体集合,而非ArrayList对象本身 order -> order); // 映射函数接收单个Order对象,返回需要适配的元素(此处直接返回实体)
不推荐的替代方案
错误提示中提到修改@PlanningSolution的LookUpStrategyType虽能绕过错误,但不建议使用:
- 若将查找策略改为
LOOKUP_STRATEGY_NONE或LOOKUP_STRATEGY_REFERENCE,会失去@PlanningId提供的实体唯一标识能力,导致多线程求解、分布式部署等场景出现异常。
内容的提问来源于stack exchange,提问作者FERTANOV
相关产品推荐
相关产品推荐

