如何通过条目索引对数组进行排序?

时间:2014-07-09 13:51:55

标签: java arrays sorting

我需要对包含double值的数组的INDEXES进行排序。排序应按升序进行。我这样做的方式如下(见下文)。如果数组包含整数值,它可以正常工作,但它停止使用double值。为什么?请注意我正在排序索引,而不是数组的值。

结果应为[1,0],即[893.05,1129.25]

double[] times = new double[2];

times[0] = 1129.25;
times[1] = 893.05;

ArrayIndexComparator comparator = new ArrayIndexComparator(times,0);
Integer[] sortedTimes = comparator.createIndexArray();
Arrays.sort(sortedTimes, comparator);

public class ArrayIndexComparator implements Comparator<Integer>
{
    private double[] array;
    private int sort;

    public ArrayIndexComparator(double[] array, int sort)
    {
        this.array = array;
        this.sort = sort;
    }

    public Integer[] createIndexArray()
    {
        Integer[] indexes = new Integer[array.length];
        for (int i = 0; i < array.length; i++)
        {
            indexes[i] = i;
        }
        return indexes;
    }

    @Override
    public int compare(Integer index1, Integer index2)
    {
        if (sort == 0)
            return Double.compare(array[index2],array[index1]); // descending order ...2,1,0
        else
            return Double.compare(array[index1],array[index2]); // ascending order 0,1,2,...
    }
}

3 个答案:

答案 0 :(得分:1)

在自定义比较器的compare方法中,由于您在构造函数的调用中将sort字段设置为0,因此按降序排序。

只需将0替换为ArrayIndexComparator comparator = new ArrayIndexComparator(times,0);

中的任何其他号码

e.g。 ArrayIndexComparator comparator = new ArrayIndexComparator(times,1);

答案 1 :(得分:0)

我没有完全理解你所说的内容,但我得到了你想要只修改比较功能的结果

    @Override
    public int compare(Integer index1, Integer index2)
    {

        if (index1<index2){
            return 1;
        }
        else if (index1>index2){
            return -1;
        }
        else{
            return 0;
        }
     }

答案 2 :(得分:0)

 ArrayIndexComparator comparator = new ArrayIndexComparator(times,1);

使用上面的(传递1指示升序排序),我按升序获得正确的值。

测试代码

    for(Integer op : sortedTimes)
    {
        System.out.println(times[op]);
    }

输出

893.05
1129.25