2014-06-07 155 views
-2

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

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

我试图去掉不相关的代码份这里:

Main类

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

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

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

,返回的值完全相同。

+0

为什么你认为你的'compareTo'是错的?你是否遇到编译时错误,或者数组排序不正确? – dasblinkenlight

+0

是忘了提。代码编译时没有错误,但数组并未排序(完全没有)。它似乎好像这种甚至没有被称为。我知道它没有排序,因为我知道输出应该是什么样子。 – Dimebag

+0

为什么不在单元compareTo中,只是返回getValue(0) - CompareUnit.getValue(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

+0

嗯尝试我的原始代码,但与if-else语句。不起作用。然后也尝试了你的代码,结果仍然是一样的。我会更新主要问题,因为我似乎在代码中发现了一个相当不同的问题。我会尽快回复。 – Dimebag

+0

这工作!我承认,又犯了一件毁了一切的错误,但你的解决办法就是这样。谢谢! – Dimebag

+0

不错,它工作:) – smttsp

0

如果你想进行排序按名称:

return compareUnit.name.compareTo(name); 

别的我不知道是什么属性你的getValue(0)返回给你,但仍然如果你想排序按的getValue(0) :

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

谢谢你的回答。请再次检查主帖子,我添加了我如何测试并注意到排序不起作用。还补充说getValue返回单个数字类型double。可悲的是,你的解决方案不起作用。我真的不知道发生了什么问题。 – Dimebag