Сортировать массив int [] через массив double [] - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть массив

double[] weights = { 32.0, 32.0, 25.0, 25.0, 30.0, 28.0,
                     12.0, 10.0,  8.0,  8.0, 18.0,  0.0 };

Я хочу отсортировать соответствующие индексы от 0 до 11 по убыванию weights:

{ 32.0, 32.0, 30.0, 28.0, 25.0, 25.0, 18.0, 12.0, 10.0, 8.0, 8.0, 0.0 }

Мой желаемый результат в этом случае будет int[]:

{ 0, 1, 4, 5, 2, 3, 10, 6, 7, 8, 9, 11 }

Я добавил значения int [] для отслеживания индексов:

int[] values = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }

Ответы [ 3 ]

7 голосов
/ 05 декабря 2011

Создайте сопоставимый класс контейнера, например,

class EvanContainer implements Comparable<EvanContainer> {
    double weight;
    int value;

    EvanContainer(double w, int v) { weight = w; value = v; }

    public int compareTo(EvanContainer other) {
        return Double.compare(weight, other.weight);
    } 

}

Тогда вы можете отсортировать это как обычно.

EvanContainer[] container = new EvanContainer[weights.length];
for(int i = 0; i < weights.length; i++) {
    container[i] = new EvanContainer(weights[i],values[i]);
}

Arrays.sort(container);
1 голос
/ 07 декабря 2011

У меня недавно была эта проблема, и ответ на кодировщик свечения, безусловно, самый чистый и простой ответ.Проблема, которая возникла у меня с этим конкретным подходом, заключается в том, что он требует, чтобы вы «упаковали» каждый элемент, который вы хотите сравнить.Теперь, если у вас очень большое количество элементов в примитивном массиве, вам не нужно оборачивать каждый элемент в объекте, а затем использовать Comparable для сортировки обернутых объектов из-за влияния на производительность.

ИтакЯ разработал следующее решение, которое доступно на Java в виде кода с открытым исходным кодом под лицензией GPL здесь: http://open.trickl.com/trickl-sort/index.html

Представленные алгоритмы сортировки позволяют задавать «перестановку».StandardPermutator просто переупорядочивает элементы в массиве в соответствии с запросом (например, меняет местами два элемента с разными индексами).PairedPermutator также выполняет ту же перестановку для другого массива (в данном случае, массива индексов).

Таким образом, я могу использовать тот же эффективный алгоритм сортировки в массиве примитивов и дополнительно отслеживать перестановку индекса, даже не помещая значения в массив.В любом случае, это теория, я не проводил никаких реальных сравнений производительности ... В любом случае, я надеюсь, что представленная библиотека дает более гибкий подход к сортировке.

0 голосов
/ 05 декабря 2011

A Карта может быть хорошей структурой поддержки - она ​​хранит ваши значения и индексы в парных группах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...