哈希映射的遍历值是按递减顺序还是按递增顺序键入值?

时间:2015-11-19 19:01:49

标签: java arraylist hashmap

我试图按递减顺序或递增顺序遍历Hash地图,但我没有得到正确的输出。

这是我的地图:

Hashmap<String Integer> hm= new Hashmap<String,Integer>();

以下是我的价值观:

Key    Value
Hi     4
kumar  1
Hello  1
vivek  3

我正在尝试类似的事情:

List<Integer> ValueList = new ArrayList<Integer>(hm.values());
                ArrayList<String> keyList = new ArrayList<String>(hm.keySet());

Collections.sort(ValueList);
                Collections.reverse(keyList);
                Collections.reverse(ValueList);

我希望这样:

Key    Value
kumar  1
Hello  1
vivek  3
Hi     4

3 个答案:

答案 0 :(得分:1)

我建议使用Apache Commons Collections ListOrderedMap。这是解决方案:

//Populate the map
Map<String, Integer> map = new HashMap<>();
map.put("Hi", 4);
map.put("kumar", 1);
map.put("Hello", 1);
map.put("vivek", 3);

//Sort the values
List<Integer> values = new ArrayList<Integer>(map.values());
Collections.sort(values);

int size = values.size();
Set<Entry<String, Integer>> entries = map.entrySet();

//Create a new ordered map
ListOrderedMap<String, Integer> orderedMap;
orderedMap = ListOrderedMap.listOrderedMap(new HashMap<String, Integer>(map));

for (int i = 0; i < size; i++) {

    Integer value = values.get(i);
    Iterator<Entry<String, Integer>> iter = entries.iterator();

    while (iter.hasNext()) {
        Entry<String, Integer> entry = iter.next();
        if (value.equals(entry.getValue())) {
            //Put all values at index i that match the value
            orderedMap.put(i, entry.getKey(), value);
        }
    }
}

//Print the orderedMap key/value pairs
entries = orderedMap.entrySet();
for (Entry<String, Integer> entry : entries) {
    final String key = entry.getKey();
    final Integer value = entry.getValue();
    System.out.println("key = " + key + ", value = " + value);
}

输出:

key = Hello, value = 1
key = kumar, value = 1
key = vivek, value = 3
key = Hi, value = 4

答案 1 :(得分:0)

您可以将地图视为一组条目,其中每个条目都有一个键和一个值。所以你想要的是一个排序的条目列表。您不能只对键或值进行排序,因为您将丢失键和值之间的关联:

List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
entries.sort(Comparator.comparing(Map.Entry::getValue));

答案 2 :(得分:0)

如果您需要经常访问这些值,可以使用TreeMap对象来避免排序。

http://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html

这个特殊的Map可以像普通的HashMap一样使用其附加功能,它会使用ComparableEquals和{{1}自动对键进行排序方法(你必须Hash

如果您定义了自己的密钥类,则可以使其自动对值进行排序。

如果您不需要此性能提升,则提取值然后使用override对其进行排序也很有效。