Я написал код для вычисления ранга каждого элемента массива double[] в следующем коде. Например, если у меня есть double
массив {3, 1.3, 2, 3}
, я нахожу ранг как {2, 0, 1, 2}
. Он был рассчитан как
- 1.3 является наименьшим, поэтому он получил ранг 0.
- 2 является следующим, поэтому он получил ранг 1.
- 3 — следующее большее число, поэтому обе тройки получают ранг 2.
public static void main() {
double[] x = {3, 1.3, 2, 3};
System.out.println(Arrays.toString(x) + " - original");
System.out.println("[2, 0, 1, 2] - should be");
System.out.println(Arrays.toString(findRank(x)) + " - our rank");
}
private static int[] findRank(double[] x){
List<Double> lst = new ArrayList<Double>();
int[] rank=new int[x.length]; // maximum length for already unique array
for(double d:x)
if (lst.indexOf(d) == -1) //only unique elements in list
lst.add(d);
Collections.sort(lst);
for(int i=0;i<x.length;i++) {
rank[i]=lst.indexOf(x[i]);
}
return rank;
}
Этот код дает следующий вывод
[3.0, 1.3, 2.0, 3.0] - original
[2, 0, 1, 2] - should be
[2, 0, 1, 2] - our rank
Что меня интересует, так это лучшая реализация приведенного выше кода. Как это можно сделать лучше?
Редактировать
Этот вопрос требует, чтобы повторяющиеся элементы ранжировались одинаково и непрерывно, то есть {0,1,2,3,...}
, без пропуска промежуточного ранга, который отличается от аналогичного, но другого вопроса Как узнать ранг каждого элемента в массиве целых чисел. Этот вопрос требует вывода {3,0,1,3}
, если задан ввод {3,1,2,3}
. т. е. он по-разному обрабатывает повторяющиеся элементы или ломается при дублировании значений во входных данных. Но это касается и обработки дубликатов, и желаемый результат — {2,0,1,2}
.