如何通过多个权重对数组进行排序?

时间:2013-08-15 07:33:41

标签: sorting

例如:我有一系列人类:

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

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

眼睛颜色最有价值(越高越好) 病房后 - 身高,最后发色

假设所有整数都在0-10范围内 我想为人类实体创建一个“等级”字段: 乘以以下逻辑:

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

之后只按排名排序。

我觉得这是按重量排序的原始方式(如果它甚至是正确的)。 还有更优雅的方法吗?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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

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

权重的值完全取决于您自己决定,但正如您所知,它们对排名的影响与属性本身一样多。所以提出一个好的启发式(即权重的值集)对于排名系统来说非常重要。不幸的是,这往往涉及反复试验(非常痛苦和耗时)。

只需fyi,您就可以让机器自动执行此过程并使用反馈循环自行调整重量。您需要研究一下机器学习