什么是在一个域中的优先级/偏好建模的最佳方式?
例如,假设我有一类Person
代表一个人,有一定的偏好,例如PersonX
喜欢比萨饼,spaggetti和omelete,实际上他宁愿通心粉了比萨饼。
如何在这些最好的蓝本?
首先想到的是仅仅把它们放在一个List
(作为成员变量Person
按照插入顺序例如,在列表中的第一个)保持偏好是最者优先,然后在列表中的第二个第二个最首选等,但此在我看来,最终被太繁琐。 例如,当我想要做的喜好等搜索或协会
也许有像这样的问题的标准方法?
Answer 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);
而比较器将简单地检查偏好的索引列表(如果它包含偏好等)。
Answer 2:
你可以使用一个优先级队列为代表对象的优先级,并确定适当的Comparator
你的类,考虑到描述的规则。 队列使用,将采取,因为它们可以被插入保持按优先级排序的对象的照顾优先级堆。
Answer 3:
Preference
作为一个整体在了自己一套完整的实体,但不会有任何意义,除非它与任何相关的Person
,但是能住上自己的。
至于偏好优先而言, Preference
没有任何优先权蛋卷,比萨饼都是相似的,但它有当它与人相关联(比如我喜欢披萨超过煎蛋优先级,而不是依赖于我的比萨饼或煎蛋卷)。
所以,你有一个Preference
和Person
对象。
现在,将优先从因人而异,所以你会期望与人联系起来。
由于优先级是非常依赖于人,你有多种选择来实现:
- 使用的PriorityQueue -同时加入偏好分配优先级。 此队列将出现在Person类本身
- 使用自定义的比较器(建议由@assylias)
- 添加规则偏好(基于位置,性别等),并具有给定的某些条件时,将返回由系统计算的偏好预先配置的规则,虽然具有这种手动超控。 在这种情况下,你可以使用
PriorityQueue
。
Answer 4:
使用类结构是这样的...(原谅马虎的Java ...我是一个C#的家伙)
public class PersonPreference
{
public Preference preference;
public int rank;
}
然后,允许用户自己的喜好(因此,排名列),并且为了在该属性/列,必要时进行排序。
编辑
再次在这个来看,我想重新定义我的课。 一个首选项应该是用户的喜欢相较于其他像...
public class PersonLike
{
public string like;
public int rank;
}
这个新的类定义的东西喜欢一个人,并且它允许一个等级,这样,当你有这样的类(或它的数据表示)的许多情况下,他们能排,这在影响,产生偏好,因为偏好本质上是喜欢的东西在别的用户。 一个像本身并不是一个偏好,因为它没有被对其他任何东西相比。
这种方法允许n个利益互相反对建立一个大集合的喜好进行排名。
文章来源: What is the best way to represent priorities/preferences in objects?