1

例如:我有一个人类数组:

Human{
private int eyeColor;
private int hairColor;
private int height;
}

我想按多个权重对数组进行排序:

眼睛颜色是继病房之后最有价值的(越高越好)——身高,最后是头发颜色

等等

假设所有整数的范围为 0-10,我考虑为 Human 实体创建一个“等级”字段:而不是将其乘以以下逻辑:

rank+= 10000 * eyeColor;
rank+= 1000 * height;
rank+= 100 * hairColor;

之后只需按等级排序。

我觉得这是一种按权重排序的原始方式(如果它甚至正确的话)。有没有更优雅的方法呢?

4

2 回答 2

0

也许我的回答过于关注实现细节。您的问题是是否有更优雅的方法?我说不。您基本上必须将具有 3 个整数的对象映射到一个可以稍后进行比较的单个整数。

如果您的类中有更多的属性,您必须在将来的比较中包含这些属性,我建议您可以制作一些更通用的代码版本,其中每个属性都由一个属性和相应的权重组成。通过这种方式,您可以创建一种更通用的 compareTo 方法。但不要过早优化。

我建议像这样实现Comparable接口:

public Human(int eyeColor, int hairColor, int height) {
    this.eyeColor = eyeColor;
    this.hairColor = hairColor;
    this.height = height;
}

public static void main(String[] args) {
    List<Human> humans = new ArrayList<Human>();
    humans.add(new Human(20, 10, 5));
    humans.add(new Human(50, 50, 2));

    Collections.sort(humans);
    for(Human human : humans) {
        System.out.println(human);
    }
}

@Override
public int compareTo(Human o) {

    int thisRank = 10000 * eyeColor;
    thisRank += 1000 * height;
    thisRank += 100 * hairColor;

    int otherRank = 10000 * o.eyeColor;
    otherRank += 1000 * o.height;
    otherRank += 100 * o.hairColor;

    return thisRank - otherRank;
}
于 2013-08-15T07:41:58.587 回答
0

简短的回答是否定的。当涉及到多个属性/标准的排名时,您可以使用的最简单的公式之一是:

排名 = (weight1 * attribute1) + (weight2 * attribute2) + ... + (weightN * attributeN)

这几乎就是你已经拥有的。

权重的值完全由您决定,但正如您所知,它们对排名的影响与属性本身一样大。因此,提出一个好的启发式方法(即权重值的集合)对于排名系统非常重要。不幸的是,这通常涉及反复试验(非常痛苦且耗时)。

仅供参考,您可以让机器自动执行此过程并使用反馈循环自行调整权重。您将需要对机器学习进行一些研究。

于 2013-08-15T10:43:15.913 回答