基于属性对对象数组进行排序

时间:2014-06-07 14:46:30

标签: java arrays sorting

编辑:添加了一些信息。

我有一个对象数组。每个对象都有一个名称和一个值。我需要按照这些值的降序对对象进行排序,并打印名称。我看到了这个简单的解决方案,但似乎无法将其应用于我的问题:http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/

代码编译时没有错误,但数组未按排序。我知道这是因为我知道输出应该是什么,即输出应该是var364,var200,var65等等。我得到的是var1,var2,var3等。

我试图在这里删除不相关部分的代码:

主要课程

print(data.preselection());

private void print (UnitRow preselectedUnitRow) {
    out.printf("Variables after preselection: \n");
    for (int i=0;i<PRESELECTION_LIMIT;i++) {
        out.printf("%s, ",preselectedUnitRow.getUnitName(i));
    }
}

数据集(数据)

private UnitRow data;

...

public UnitRow preselection() {
    UnitRow standardDeviationUnits = new UnitRow(numberOfVariables);
    for (int i=0;i<numberOfVariables;i++){
        Unit unit = new Unit(1,variableNames[i],calculateStandardDeviation(i));
        standardDeviationUnits.add(unit);
    }
    standardDeviationUnits.sort();
    return standardDeviationUnits;
}

UnitRow

import java.util.Arrays;

public class UnitRow {

    private Unit[] units;
    private int count;

    ...

    public void sort() {
        Arrays.sort(units);
    }
}

单元

public class Unit implements Comparable<Unit>{

    private NumberRow elements; //just a class with an array of doubles
    private String name;

    ...

    @Override
    public int compareTo(Unit compareUnit) { //getValue returns a single type double number
        int comparison = (int) (compareUnit.getValue(0) - getValue(0));
        return comparison;
    }
}

我假设我的Comparable实现是错误的。你能发现问题吗? 我这样说是因为我测试如下:

System.out.println(standardDeviationUnits.getValue(0,0));
standardDeviationUnits.sort();
System.out.println(standardDeviationUnits.getValue(0,0));

返回完全相同的值。

2 个答案:

答案 0 :(得分:0)

看起来像逆序

public int compareTo(Unit compareUnit) {
    if (getValue(0) < compareUnit.getValue(0)) return 1;
    else if (getValue(0) > compareUnit.getValue(0)) return -1;
    return 0;
}

试试这个。

另请注意,在compareTo中,您不必要地写了返回2;并写了3 if而不是1 if-else

答案 1 :(得分:0)

如果您尝试按名称排序:

return compareUnit.name.compareTo(name);

否则我不知道你的getValue(0)返回给你的属性,但是如果你试图按照getValue(0)排序:

return compareUnit.getValue(0)-getValue(0);