6

在域中建模优先级/偏好的最佳方法是什么?
例如,假设我有一个Person代表一个人的类并且有一些偏好,例如PersonX喜欢披萨、意大利面条和煎蛋卷,实际上他更喜欢意大利面条而不是披萨。
这些是如何最好地建模的?
第一个想法就是把它们放在一个List(作为 的成员变量Person)中,根据插入顺序保持偏好,例如列表中的第一个是最喜欢的,然后列表中的第二个是第二个最喜欢的等等,但这似乎我最终太乏味了。例如,当我想对偏好等进行搜索或关联时。
也许有这样的问题的标准方法?

4

4 回答 4

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);

比较器会简单地检查列表中的首选项索引(如果它包含该首选项等)。

于 2012-05-01T15:13:58.523 回答
1

您可以使用优先级队列来表示对象优先级,并为您的类定义一个适当Comparator的考虑到所描述的规则。队列使用优先级堆,该堆将负责在插入对象时维护按优先级排序的对象。

于 2012-05-01T15:14:51.463 回答
1

使用这样的类结构...(请原谅草率的 Java...我是 C# 人)

public class PersonPreference
{
     public Preference preference;
     public int rank;
}

然后,允许您的用户对他们的偏好(因此,排名列)进行排序,并在必要时对该属性/列进行排序。

编辑

再看一遍,我想重新定义我的班级。偏好应该是用户的喜好与另一个喜好相比...

public class PersonLike
{
     public string like;
     public int rank;
}

这个新类定义了一个人喜欢的东西,并且它允许一个排名,这样当你有这个类的许多实例(或它的数据表示)时,它们可以被排名,这实际上产生了偏好,因为偏好本质上是用户喜欢某物而不是其他东西。喜欢本身并不是一种偏好,因为它没有与其他任何东西进行比较。

这种方法允许对 n 个兴趣进行排名,从而创建大量偏好。

于 2012-05-01T15:20:03.437 回答
1

Preference作为一个整体,它本身就是一个完整的实体,尽管它没有任何意义,除非它与任何实体相关联Person但可以独立存在。

就 Preference 优先级而言,Preference没有任何优先级 Omelet,Pizza 都是相似的,但是当它与 Person 关联时它具有优先级(比如说我喜欢 Pizza 多于 omelet,取决于我而不是 Pizza 或 Omelet )。

所以你有一个PreferencePerson对象。

现在 Preference 将因人而异,因此您将 Preference 与 Person 相关联。

由于优先级在很大程度上取决于 Person 你有多种选择来实现:

  1. 使用PriorityQueue - 添加 Preference 时分配优先级。该队列将出现在 Person 类本身中
  2. 使用自定义比较器(如@assylias 所建议)
  3. 将规则添加到首选项(基于位置、性别等)并具有预先配置的规则,当给定某些标准时,这些规则将返回系统计算的首选项,尽管对此进行手动覆盖。在这种情况下,您可以只使用PriorityQueue.
于 2012-05-01T17:01:14.260 回答