TreeMap迭代不会给我排序键

时间:2016-03-20 20:54:56

标签: java collections treemap

我有以下Java代码。我希望看到按键排序打印的键(因为我使用的是TreeMap),但它没有对键进行排序。我缺少什么?

CODE:

public class TreeMapTest {
    static TreeMap<String,String> li=new TreeMap<String,String>();

    static void readAndPrint(){
        for (Map.Entry<String, String> entry:li.entrySet() ){
            System.out.println(entry);
        }

    }
    public static void main(String[] args) {
        for (int i=0;i<10;i++){
            String key = String.valueOf(new Random().nextInt(100));
            String item = UUID.randomUUID().toString().substring(30);
            li.put(key,item);
            System.out.println(MessageFormat.format("inserting ({0},{1})",key,item));
        }

        readAndPrint();
    }
} 

示例输出:

inserting (7,f4b66a)
inserting (2,5f417d)
inserting (51,90bb9f)
inserting (99,4bfb73)
inserting (41,a4e9d5)
inserting (14,9286d6)
inserting (44,ec4fbd)
inserting (58,e7dd3a)
inserting (69,c54e66)
inserting (0,d1fbfe)
0=d1fbfe
14=9286d6
2=5f417d
41=a4e9d5
44=ec4fbd
51=90bb9f
58=e7dd3a
69=c54e66
7=f4b66a
99=4bfb73

如你所见,我没有对元素进行排序(我有时会对输出进行排序,有时候它没有像上面那样排序!)。我错过了什么或误解了什么?

4 个答案:

答案 0 :(得分:6)

他们按字符串的默认排序顺序进行排序。字符串按字典顺序排序,因此"14"被视为小于"2"

如果你想要数字排序顺序,你应该使用Integers而不是Strings。

答案 1 :(得分:2)

在将密钥保持为String s的同时执行此操作的一种方法是使用Treemap(Comparator)构造函数:

static TreeMap<String, String> li = new TreeMap<>(Comparator.comparing(Integer::valueOf));

当然,使密钥Integer也可以。

答案 2 :(得分:1)

地图按字典顺序排列键,因为它们是字符串(第一个字符为1 < 4,其他字符为依此类推。)

最简单的方法是将密钥设为Integer s:

TreeMap<Integer,String> li=new TreeMap<>();

这将避免使用String.valueOf转换整数的不必要的需要。

答案 3 :(得分:1)

如果您想要基于整数的比较,那么您需要在地图中使用整数键。改变

static TreeMap<String,String> li=new TreeMap<String,String>();

static TreeMap<Integer,String> li=new TreeMap<Integer,String>();

,并将put方法改为:

Integer key = new Random().nextInt(100);
String item = UUID.randomUUID().toString().substring(30);
li.put(key,item);