什么是代表对象的优先级/偏好的最佳方式?(What is the best way to repre

2019-09-16 22:28发布

什么是在一个域中的优先级/偏好建模的最佳方式?
例如,假设我有一类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没有任何优先权蛋卷,比萨饼都是相似的,但它有当它与人相关联(比如我喜欢披萨超过煎蛋优先级,而不是依赖于我的比萨饼或煎蛋卷)。

所以,你有一个PreferencePerson对象。

现在,将优先从因人而异,所以你会期望与人联系起来。

由于优先级是非常依赖于人,你有多种选择来实现:

  1. 使用的PriorityQueue -同时加入偏好分配优先级。 此队列将出现在Person类本身
  2. 使用自定义的比较器(建议由@assylias)
  3. 添加规则偏好(基于位置,性别等),并具有给定的某些条件时,将返回由系统计算的偏好预先配置的规则,虽然具有这种手动超控。 在这种情况下,你可以使用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?