在Java中:获取按地图键分类的地图值的数组

时间:2010-11-03 23:04:24

标签: java arrays sorting hashmap

我有一个hashmap,我希望在这个hashmap中得到一个值数组,但是我希望数组按hashmap中的键排序。

例如,如果地图如下所示:

  • &2,OBJ1>
  • < 4,&OBJ2 GT;
  • ℃,,OBJ3>
  • < 10,&OBJ4 GT;
  • 小于5,obj5>
  • &。1,obj6>
  • < 15,obj7>
  • < 3,obj8>

我希望数组为:[obj3,obj6,obj1,obj8,obj2,obj5,obj4,obj7]

越快越好。是否有内置的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

听起来像是SortedMap,特别是TreeMap。您可以使用以下事实:地图维护一个排序的键列表以生成输出数组,例如:使用SortedMap.values()或迭代地图中的条目。

答案 1 :(得分:1)

我总是喜欢什么时候才能以通过单元测试的形式回答:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;

public class SortedMapValuesTest extends TestCase {
    public void testSortedMapValues() throws Exception {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(1, 200);
        map.put(2, 300);
        map.put(3, 100);
        List<Integer> list = getSortedMapValues(map);
        assertEquals("[200, 300, 100]", list.toString());
    }

    private <K extends Comparable<K>, V> List<V> getSortedMapValues(Map<K, V> map) {
        ArrayList<K> keys = new ArrayList<K>(map.keySet());
        ArrayList<V> values = new ArrayList<V>(keys.size());
        Collections.sort(keys);
        for (K key : keys)
            values.add(map.get(key));
        return values;
    }
}