在域中建模优先级/偏好的最佳方法是什么?
例如,假设我有一个Person
代表一个人的类并且有一些偏好,例如PersonX
喜欢披萨、意大利面条和煎蛋卷,实际上他更喜欢意大利面条而不是披萨。
这些是如何最好地建模的?
第一个想法就是把它们放在一个List
(作为 的成员变量Person
)中,根据插入顺序保持偏好,例如列表中的第一个是最喜欢的,然后列表中的第二个是第二个最喜欢的等等,但这似乎我最终太乏味了。例如,当我想对偏好等进行搜索或关联时。
也许有这样的问题的标准方法?
4 回答
您可以按照您的建议使用该列表,并向您的 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);
比较器会简单地检查列表中的首选项索引(如果它包含该首选项等)。
您可以使用优先级队列来表示对象优先级,并为您的类定义一个适当Comparator
的考虑到所描述的规则。队列使用优先级堆,该堆将负责在插入对象时维护按优先级排序的对象。
使用这样的类结构...(请原谅草率的 Java...我是 C# 人)
public class PersonPreference
{
public Preference preference;
public int rank;
}
然后,允许您的用户对他们的偏好(因此,排名列)进行排序,并在必要时对该属性/列进行排序。
编辑
再看一遍,我想重新定义我的班级。偏好应该是用户的喜好与另一个喜好相比...
public class PersonLike
{
public string like;
public int rank;
}
这个新类定义了一个人喜欢的东西,并且它允许一个排名,这样当你有这个类的许多实例(或它的数据表示)时,它们可以被排名,这实际上产生了偏好,因为偏好本质上是用户喜欢某物而不是其他东西。喜欢本身并不是一种偏好,因为它没有与其他任何东西进行比较。
这种方法允许对 n 个兴趣进行排名,从而创建大量偏好。
Preference
作为一个整体,它本身就是一个完整的实体,尽管它没有任何意义,除非它与任何实体相关联Person
但可以独立存在。
就 Preference 优先级而言,Preference
没有任何优先级 Omelet,Pizza 都是相似的,但是当它与 Person 关联时它具有优先级(比如说我喜欢 Pizza 多于 omelet,取决于我而不是 Pizza 或 Omelet )。
所以你有一个Preference
和Person
对象。
现在 Preference 将因人而异,因此您将 Preference 与 Person 相关联。
由于优先级在很大程度上取决于 Person 你有多种选择来实现:
- 使用PriorityQueue - 添加 Preference 时分配优先级。该队列将出现在 Person 类本身中
- 使用自定义比较器(如@assylias 所建议)
- 将规则添加到首选项(基于位置、性别等)并具有预先配置的规则,当给定某些标准时,这些规则将返回系统计算的首选项,尽管对此进行手动覆盖。在这种情况下,您可以只使用
PriorityQueue
.