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

2022-08-31 14:38:16

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

例如,我有这样的HashMap值:

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

map= {Not-Specified 1, test 2, testtest 3};

“未指定”可以出现在任何位置。它可能排在第一位,也可能在地图的中间。但我想将“未指定”移动到最后一个位置。

我该怎么做?提前致谢。


答案 1

用一句话回答你的问题:

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


还有一个旁注:最好是针对接口而不是实现类进行编码(参见Joshua Bloch的有效Java,第8章,第52项:通过接口引用对象)。

所以你的声明应该写成:

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

(所有映射共享一个公共协定,因此客户端不需要知道它是哪种类型的映射,除非他指定具有扩展协定的子接口)。


可能的解决方案

排序地图:

有一个子接口SortedMap,它使用基于顺序的查找方法扩展了映射接口,并且它有一个子接口NavigableMap,可以进一步扩展它。此接口的标准实现 TreeMap 允许您按自然排序(如果它们实现可比较接口)或通过提供的比较器对条目进行排序。

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

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

链接的地图:

还有LinkedHashMap的特殊情况,这是一种HashMap实现,用于存储密钥的插入顺序。但是,没有用于备份此功能的接口,也没有直接访问最后一个密钥的方法。您只能通过技巧来做到这一点,例如在以下两者之间使用列表:

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

使用哈希映射的解决方案:

如果您必须依赖HashMaps,仍然有一个解决方案,使用a)上述比较器的修改版本,b)使用Map的条目Set初始化的列表和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


答案 2

HashMap没有“最后一个位置”,因为它没有排序。

您可以使用其他实现,最受欢迎的是。Mapjava.util.SortedMapTreeMap