TreeMap 迭代不给我排序键
TreeMap iteration does not give me sorted keys
我有下面的 Java 代码摘录。我期待看到以排序方式打印的键(因为我使用的是 TreeMap),但它没有对键进行排序。我缺少什么?
代码:
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
如您所见,我没有对元素进行排序(我有时对输出进行排序,有时却没有像上面那样排序!)。我遗漏或误解了什么?
地图按字典顺序对键进行排序,因为它们是字符串(第一个字符为 1 < 4
,其他字符依此类推)。
最简单的方法是将密钥设置为 Integer
s:
TreeMap<Integer,String> li=new TreeMap<>();
这将避免使用 String.valueOf
.
不必要地转换整数
它们是排序的,按照字符串的默认排序顺序。字符串按字典顺序排列,因此 "14"
被认为小于 "2"
.
如果您想要数字排序顺序,您应该将键设置为整数而不是字符串。
如果你想要基于整数的比较,那么你需要在地图中有整数键。更改
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);
在保持密钥为 String
的同时,一种方法是使用 Treemap(Comparator)
构造函数:
static TreeMap<String, String> li = new TreeMap<>(Comparator.comparing(Integer::valueOf));
当然,制作钥匙 Integer
s 也可以。
我有下面的 Java 代码摘录。我期待看到以排序方式打印的键(因为我使用的是 TreeMap),但它没有对键进行排序。我缺少什么?
代码:
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
如您所见,我没有对元素进行排序(我有时对输出进行排序,有时却没有像上面那样排序!)。我遗漏或误解了什么?
地图按字典顺序对键进行排序,因为它们是字符串(第一个字符为 1 < 4
,其他字符依此类推)。
最简单的方法是将密钥设置为 Integer
s:
TreeMap<Integer,String> li=new TreeMap<>();
这将避免使用 String.valueOf
.
它们是排序的,按照字符串的默认排序顺序。字符串按字典顺序排列,因此 "14"
被认为小于 "2"
.
如果您想要数字排序顺序,您应该将键设置为整数而不是字符串。
如果你想要基于整数的比较,那么你需要在地图中有整数键。更改
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);
在保持密钥为 String
的同时,一种方法是使用 Treemap(Comparator)
构造函数:
static TreeMap<String, String> li = new TreeMap<>(Comparator.comparing(Integer::valueOf));
当然,制作钥匙 Integer
s 也可以。