基于key对树图进行排序,其中key是可变的

时间:2011-08-03 11:43:02

标签: java treemap

我想基于key是变量的键对树映射进行排序,因此排序应该基于变量值,我们如何实现这一点?我希望在构建的排序方法中使用rathar通过代码实现它,任何回复示例都有很大的帮助。

3 个答案:

答案 0 :(得分:20)

TreeMap(实现SortedMap)以正确的顺序自动存储密钥:

Map<Integer, String> map = new TreeMap<Integer, String>();
map.put(1, "one");
map.put(3, "three");
map.put(2, "two"); 
// prints one two three   
for(Integer key : map.keySet()) {
    System.out.println(map.get(key));
}

作为键入类型(在这种情况下为Integer),您可以使用任何实现Comparable的类(或者您可以在创建TreeMap时提供Comparator)< / p>

编辑:好的,这是一个如何重新映射地图的建议。

Map<Integer, String> oldMap; // get oldMap from somewhere
// Prepare remapping
Map<Integer, String> newMap = new TreeMap<Integer, String>();
Map<Integer, Integer> keyMap = new HashMap<Integer, Integer>();
// Store a new key for each old key
keyMap.put(oldKey, newKey);
// fill the newMap
for(Integer oldKey : keyMap.keySet()) {
    newMap.put(keyMap.get(oldKey), oldMap.get(oldKey));
}
oldMap = newMap; // if needed

答案 1 :(得分:0)

TreeMap实现SortedMap接口,并按键排序,无需执行任何操作:

  

地图根据其键的自然顺序排序,或者按照   在地图创建时提供Comparator,具体取决于哪个   使用构造函数。

答案 2 :(得分:0)

treemap是红黑树,是平衡的binary search tree。换句话说,树已经被排序(或者更确切地说,根据二进制搜索树规则排列),其高度平衡,使得树操作具有O(lg n)复杂度。但是,我认为你想要的是按排序顺序打印所有键。这就像在树形图上实现inorder遍历一样简单,或者您可以使用keySet()方法获取Set并迭代值。

e.g。遍历遍历

void inorderTraversal( Node root ){
    if( root == null ) return;
    inorderTraversal( root.getLeft() );
    root.printValue();
    inorderTraversal( root.getRight() );
}

修改

好的,我很确定这就是你想要的。您想按值排序:

        Map<String, Integer> map = new TreeMap<String, Integer>();
        map.put("one", 8);
        map.put("two", 10);
        map.put("three", 9);
        map.put("hundred", 1);
        System.out.println(map.values());

输出:

[1, 8, 9, 10]

所以这甚至可以用于排序字符串值:

    Map<Integer, String> map = new TreeMap<Integer, String>();
        map.put(8, "one");
        map.put(10, "two");
        map.put(9, "three");
        map.put(1, "hundred");
        System.out.println(map.values());

输出:

[hundred, one, three, two]

另外,sachin注意到“变量键”和变量值是完全不同的东西。