对域中的优先级/偏好进行建模的最佳方法是什么?
例如。假设我有一个代表一个人的班级Person
并且有一些偏好,例如PersonX
喜欢披萨,spaggetti和omelete,实际上他更喜欢spagetti而不是比萨饼。
这些最好的模型是什么?
第一个想法是将它们放在List
(作为Person
的成员变量)中,根据插入顺序保留首选项,例如列表中的第一个是最喜欢的,然后列表中的第二个是最喜欢的第二个但是在我看来最终太繁琐了。例如。当我想做偏好等搜索或关联时。
也许这样的问题有一个标准的方法吗?
答案 0 :(得分:1)
您可以按照建议使用列表,并向Person类添加一个返回Comparator<Preference>
的方法,该方法可以比较该人的2个偏好:
Person somebody.addPreference(pizzaPreference);
Person somebody.addPreference(omelettePreference);
....
Comparator<Preference> c = somebody.getPreferenceComparator();
boolean prefersPizzaOverOmelette = (c.compare(pizzaPreference, omelettePreference) > 0);
boolean hasNoPreferenceBetweenPizzaAndOmelette = (c.compare(pizzaPreference, omelettePreference) == 0);
比较器只会检查列表中首选项的索引(如果它包含该首选项等)。
答案 1 :(得分:1)
您可以使用priority queue来表示对象优先级,并为您的类定义适当的Comparator
,并考虑所描述的规则。该队列使用优先级堆,该优先级堆将负责维护在插入时按优先级排序的对象。
答案 2 :(得分:1)
使用这样的类结构......(原谅Java马哈哈......我是C#家伙)
public class PersonPreference
{
public Preference preference;
public int rank;
}
然后,允许您的用户对其偏好进行排序(因此,排名列),并在必要时对该属性/列进行排序。
修改强>
再看一遍,我想重新定义我的课程。与其他人相比,偏好应该是用户的喜欢......
public class PersonLike
{
public string like;
public int rank;
}
这个新类定义了一个人喜欢的东西,它允许排名,这样当你有这个类的许多实例(或它的数据表示)时,可以对它们进行排序,这会产生偏好,因为偏好本质上是一个用户喜欢别的东西。一个喜欢本身不是一个偏好,因为它没有与其他任何东西进行比较。
这种方法允许将n个兴趣相互排名,创建大量偏好。
答案 3 :(得分:1)
Preference
整体上是一个完整的实体,虽然没有任何意义,除非它与任何Person
相关联,但可以独立存在。
就偏好优先权而言,Preference
没有任何优先权Omelet,Pizza都是相似的,但是当它与一个人相关时它具有优先权(比如我喜欢披萨而不是煎蛋卷,取决于我,不是披萨或煎蛋卷。)
所以你有一个Preference
和Person
对象。
现在,偏好因人而异,因此您将偏好与人关联。
由于优先级非常依赖于Person,因此您可以实现多种选择:
PriorityQueue
。