一句话回答你的问题:
默认情况下,地图没有最后一个条目,这不是其合同的一部分。
附带说明:最好针对接口而不是实现类进行编码(参见Effective Java by Joshua Bloch,第 8 章,第 52 项:通过接口引用对象)。
所以你的声明应该是:
Map<String,Integer> map = new HashMap<String,Integer>();
(所有地图共享一个公共合约,因此客户端不需要知道它是哪种地图,除非他指定带有扩展合约的子接口)。
可能的解决方案
排序地图:
有一个子接口SortedMap 使用基于顺序的查找方法扩展了地图接口,它有一个子接口NavigableMap 进一步扩展了它。此接口的标准实现TreeMap 允许您按自然顺序(如果它们实现Comparable 接口)或提供的Comparator 对条目进行排序。
您可以通过lastEntry方法访问最后一个条目:
NavigableMap<String,Integer> map = new TreeMap<String, Integer>();
// add some entries
Entry<String, Integer> lastEntry = map.lastEntry();
链接地图:
还有LinkedHashMap 的特例,它是一个存储键插入顺序的HashMap 实现。然而,没有接口来备份这个功能,也没有直接的方法来访问最后一个键。您只能通过诸如在两者之间使用 List 之类的技巧来做到这一点:
Map<String,String> map = new LinkedHashMap<String, Integer>();
// add some entries
List<Entry<String,Integer>> entryList =
new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Entry<String, Integer> lastEntry =
entryList.get(entryList.size()-1);
正确的解决方案:
由于您不控制插入顺序,您应该使用 NavigableMap 接口,即您将编写一个比较器,将 Not-Specified 条目放在最后。
这是一个例子:
final NavigableMap<String,Integer> map =
new TreeMap<String, Integer>(new Comparator<String>() {
public int compare(final String o1, final String o2) {
int result;
if("Not-Specified".equals(o1)) {
result=1;
} else if("Not-Specified".equals(o2)) {
result=-1;
} else {
result =o1.compareTo(o2);
}
return result;
}
});
map.put("test", Integer.valueOf(2));
map.put("Not-Specified", Integer.valueOf(1));
map.put("testtest", Integer.valueOf(3));
final Entry<String, Integer> lastEntry = map.lastEntry();
System.out.println("Last key: "+lastEntry.getKey()
+ ", last value: "+lastEntry.getValue());
输出:
最后一个键:未指定,最后一个值:1
使用HashMap的解决方案:
如果您必须依赖 HashMaps,仍然有一个解决方案,使用 a) 上述比较器的修改版本,b) 使用 Map 的 entrySet 初始化的 List 和 c) Collections.sort() 辅助方法:
final Map<String, Integer> map = new HashMap<String, Integer>();
map.put("test", Integer.valueOf(2));
map.put("Not-Specified", Integer.valueOf(1));
map.put("testtest", Integer.valueOf(3));
final List<Entry<String, Integer>> entries =
new ArrayList<Entry<String, Integer>>(map.entrySet());
Collections.sort(entries, new Comparator<Entry<String, Integer>>(){
public int compareKeys(final String o1, final String o2){
int result;
if("Not-Specified".equals(o1)){
result = 1;
} else if("Not-Specified".equals(o2)){
result = -1;
} else{
result = o1.compareTo(o2);
}
return result;
}
@Override
public int compare(final Entry<String, Integer> o1,
final Entry<String, Integer> o2){
return this.compareKeys(o1.getKey(), o2.getKey());
}
});
final Entry<String, Integer> lastEntry =
entries.get(entries.size() - 1);
System.out.println("Last key: " + lastEntry.getKey() + ", last value: "
+ lastEntry.getValue());
}
输出:
最后一个键:未指定,最后一个值:1