根据值(数字)对HashTable进行排序,最好是降序并保持键值

时间:2011-09-21 21:59:51

标签: java sorting hashtable

我的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 个答案:

答案 0 :(得分:2)

您可以在哈希表中对条目进行排序,使用Comparator<Map.Entry<...>>的自定义实现来比较这些值。然后你就会有一个排序的条目数组,你可以随便迭代它们,随时选择键和值。

编辑:如上所述,Map.Entry值有些短暂 - 因此您可能想要创建一对来收集这两个值。 (如果您正在处理非泛型类型,则始终可以创建Object[2]以将键存储在索引0中,将值存储在索引1中...)在迭代时复制条目,然后 对结果数组进行排序。

答案 1 :(得分:1)

对数组进行排序后,遍历它并调用_yourHash.get(arytf [n])

答案 2 :(得分:1)

编辑: 重复值限额解决方案:

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“java collections framework”获得大量文章。

答案 3 :(得分:0)

如果您只想存储已排序的键/值对,可以查看LinkedHashMap:

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

我的解决方案是对Entry数组进行排序(例如,使用自定义Comparator),然后以正确的顺序将它们插入到LinkedHashMap中。

答案 4 :(得分:-1)