按值获取列表顺序

时间:2014-05-02 12:50:09

标签: java list sorting

我有一个包含不同值的列表顺序:

List<Double> values = new LinkedList<Double>();
values.add(0.1);
values.add(0.8);
values.add(0.3);

根据给定列表的值顺序获取带索引的列表的最快方法是什么,在本例中为{1,3,2},因为0.1是最小的,0.2是第二个最小值,0.8是第三个最小值?

3 个答案:

答案 0 :(得分:1)

如果所有值都是唯一值,则一种方法是使用TreeMap,然后返回调用values()的相应索引。

TreeMap<Double, Integer> map = new TreeMap<>();
int index = 0;
for(Double d : values){
    map.put(d, ++index);
}
System.out.println(map.values()); //[1, 3, 2]

此方法在O(nlogn)中运行(但使用额外的内存空间)。

如果值不是唯一的,您可以使用TreeMap<Double, List<Integer>>,然后展平Collection<List<Integer>>

答案 1 :(得分:0)

获取此索引列表的方法,仅使用jdk5

    List<Float> positions = new ArrayList<Float>();
    List<Integer> indexes = new ArrayList<Integer>();
    positions.add(0.1f);
    positions.add(0.8f);
    positions.add(0.3f);

    // copy float elements to another List, so to keep the order
    List<Float> sortedPositions = new ArrayList<Float>();
    Collections.copy(sortedPositions, positions);
    Collections.sort(sortedPositions);

    for (Float position : positions) {
        indexes.add(sortedPositions.indexOf(position));
    }

    for (Integer index : indexes) {
        System.out.print(index + ",");
    }
    // prints 1,3,2,

答案 2 :(得分:-2)

您必须对列表进行排序,以便在使用之前按自然顺序排序:

Collections.sort(values);