Сортировать HashTable в соответствии со значениями (числовыми), предпочтительно в порядке убывания, и сохранить значение ключа - PullRequest
2 голосов
/ 22 сентября 2011

В моей HashTable есть следующие пары ключ-значение.

    KEY : VALUES
    12345:45;
    23456:23;
    23445:34;
    12367:101;

    Output should be:
    12367:101;
    12345:45;
    23445:34;
    23456:23;

т.е. вывод в порядке убывания значений.

ht_sort - моя хэш-таблица, содержащая пары ключ-значение.

//get the values from the hashtable as array objects.
Object[] arytf= ht_sort.values().toArray();

//Sort the array objects.
Arrays.sort(arytf);

Но проблема в том, что я не могу связать эти отсортированные значения с хешем, чтобы получить ключи.

Я не совсем уверен, как это сделать, я проверил предыдущие темы, но не смог ничего из них сделать. Нужна помощь в этом.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 22 сентября 2011

Вместо этого вы можете отсортировать записей в хеш-таблице с пользовательской реализацией Comparator<Map.Entry<...>>, которая просто сравнивает значения.Тогда у вас будет отсортированный массив записей, и вы можете просто перебирать их, выбирая при этом и ключи, и значения.

РЕДАКТИРОВАТЬ: Как уже отмечалось, значения Map.Entry несколько переходные - таквероятно, хотите создать пару для сбора двух.(Если вы имеете дело с неуниверсальными типами, вы всегда можете создать Object[2] для хранения ключа в индексе 0 и значения в индексе 1 ...) Скопируйте записи во время итерации, и затем отсортировать полученный массив.

1 голос
/ 22 сентября 2011

РЕДАКТИРОВАТЬ: Решение с учетом дубликатов значений:

List<Map.Entry<Integer, Integer>> sortMapValues2(Map<Integer, Integer> map){
    //Sort Map.Entry by value
    List<Map.Entry<Integer, Integer>> result = new ArrayList(map.entrySet());
    Collections.sort(result, new Comparator<Map.Entry<Integer, Integer>>(){
        public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
            return o2.getValue() - o1.getValue();
    }});

    return result;  
}

Вы можете получить много статей с помощью Google "Framework Java Collection Framework".

1 голос
/ 22 сентября 2011

Как только ваш массив отсортирован, выполните итерацию по нему и вызовите _yourHash.get (arytf [n])

0 голосов
/ 22 сентября 2011
0 голосов
/ 22 сентября 2011

Если вы просто хотите сохранить отсортированные пары ключ / значение, вы можете взглянуть на LinkedHashMap:

http://download.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html

Мое решение заключается в сортировке массива Entry (например, с использованием собственного компаратора), а затем вставке их в правильном порядке в LinkedHashMap.

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