我有一个包含不同值的列表顺序:
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是第三个最小值?
答案 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);