【发布时间】:2011-11-26 17:46:03
【问题描述】:
我有一个根据我需要解析的顺序排序的 json 字符串创建的地图。
如果索引 6 处有一个键(第 7 个键),我希望能够从该键迭代到映射的末尾,并使用这些键/值对执行我需要的处理。
有没有办法做到这一点?
【问题讨论】:
我有一个根据我需要解析的顺序排序的 json 字符串创建的地图。
如果索引 6 处有一个键(第 7 个键),我希望能够从该键迭代到映射的末尾,并使用这些键/值对执行我需要的处理。
有没有办法做到这一点?
【问题讨论】:
Map 通常不维护键的顺序。您需要使用
NavigableMap,如TreeMap。如果您的键具有自然顺序,则最好使用。LinkedHashMap 是一个保留插入顺序的映射实现。示例 sn-p (LinkedHashMap):
Map<Integer, String> map = new LinkedHashMap<Integer, String>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.put(4, "four");
map.put(5, "five");
map.put(6, "six");
map.put(7, "seven");
map.put(8, "eight");
map.put(9, "nine");
int index = 0;
for (Integer key : map.keySet()) {
if (index++ < 6)
continue;
System.out.println(map.get(key));
}
// Prints:
// seven
// eight
// nine
示例 sn-p (TreeMap):
TreeMap<Integer, String> map = new TreeMap<Integer, String>();
map.put(5, "five");
map.put(6, "six");
map.put(7, "seven");
map.put(8, "eight");
map.put(9, "nine");
for (Integer key : map.tailMap(6).keySet())
System.out.println(map.get(key));
// Prints
// six
// seven
// eight
// nine
【讨论】:
The Map interface doesn't allow direct access by index. The best you can do is something like:
Map m;
....
int count 0;
for(object el : m){
if(count++ < 6) continue;
//do your stuff here
}
这假定您的 Map 实现已排序 - 否则枚举时无法保证顺序。
【讨论】:
根据底层地图实现,在解析时顺序已经丢失。
LinkedHashMap 是您所追求的野兽 - Linked 部分为您提供可预测的迭代顺序。
【讨论】: