访问地图中的最后一个条目

如何将一个特定的HashMap条目移动到最后的位置?

例如,我有这样的HashMap值:

HashMap<String,Integer> map = new HashMap<String,Integer>(); map= {Not-Specified 1, test 2, testtest 3}; 

“不明确”可能会出现在任何位置。 它可能会先出现在地图的中间。 但是我想把“未指定”移到最后的位置。

我怎样才能做到这一点? 提前致谢。

用一句话来回答你的问题:

默认情况下,地图没有最后一个条目,这不是他们合同的一部分。


另外还有一个方面:对接口进行编码是一种很好的做法,而不是实现类(见Joshua Bloch的Effective Java ,第8章,第52项: 通过接口引用对象 )。

所以你的声明应该是:

 Map<String,Integer> map = new HashMap<String,Integer>(); 

(所有的地图共享一个共同的合同,所以客户不需要知道它是什么样的地图,除非他指定了具有扩展合同的子接口)。


可能的解决scheme

sorting的地图:

有一个子接口SortedMap ,它使用基于顺序的查找方法扩展了地图接口,它有一个子接口NavigableMap ,它进一步扩展了它。 这个接口的标准实现TreeMap允许你通过自然顺序(如果它们实现了Comparable接口)或提供的比较器对条目进行sorting。

您可以通过lastEntry方法访问最后一个条目:

 NavigableMap<String,Integer> map = new TreeMap<String, Integer>(); // add some entries Entry<String, Integer> lastEntry = map.lastEntry(); 

链接地图:

LinkedHashMap还有一个特殊情况,一个HashMap实现,用于存储键被插入的顺序。 然而,没有界面来备份这个function,也没有直接的方法来访问最后一个键。 你只能通过一些技巧来做到这一点,比如在两者之间使用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); 

正确的解决scheme:

由于您不控制插入顺序,因此应该使用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的解决scheme:

如果你必须依赖HashMap,仍然有一个解决scheme,使用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

HashMap没有“最后的位置” ,因为它没有sorting。

您可以使用其他实现java.util.SortedMap Map ,最stream行的是TreeMap

SortedMap是逻辑/最佳select,但是另一种select是使用LinkedHashMap ,它维护两个顺序模式,最近添加的是最后一个,最近访问最后一个。 查看Javadocs了解更多详情。

移动对于散列表来说是没有意义的,因为它的字典有一个基于key的bucketing哈希码,然后是一个通过equals解决的碰撞hashcode的链表。 使用TreeMap进行sorting的映射,然后传入自定义比较器。

当使用数字作为关键,我想你也可以试试这个:

  Map<Long, String> map = new HashMap<>(); map.put(4L, "The First"); map.put(6L, "The Second"); map.put(11L, "The Last"); long lastKey = 0; //you entered Map<Long, String> entry for (Map.Entry<Long, String> entry : map.entrySet()) { lastKey = entry.getKey(); } System.out.println(lastKey); // 11