当前位置: 首页 > 面试题库 >

按键对HashMap排序

程和煦
2023-03-14
问题内容

你好,我需要实现一个接收HashMap并按键对它的值进行排序(mergeSort)的方法
(不使用TreeMap,SortedMap或Collections.Sort或使用JAVA Packages中的任何排序解决方案)
。我的问题是处理通配符类型…这是我的实现(由于使用通配符而返回编译错误)

public HashMap<?, ?> mergeSort(HashMap<?, ?> map) {
        if (map.size() < 1) {
            return map;
        }
        // rounds downwards
        int middle = map.size() / 2;
        int location = 0;

        HashMap<?,?> mapLeft = new HashMap<?, ?>();
        HashMap<?,?> mapRight = new HashMap<?, ?>();
        // splitting map
        for (Iterator<?> keyIter = map.keySet().iterator(); keyIter.hasNext();) {
            if (location < middle) {
                mapLeft.put(keyIter, map.get(keyIter));
            } else {
                mapRight.put(keyIter, map.get(keyIter));
            }
            location++;
        }
        // recursive call
        mapLeft = mergeSort(mapLeft);
        mapRight = mergeSort(mapRight);
        return merge(mapLeft, mapRight);
    }

    public HashMap<?, ?> merge(HashMap<?, ?> mapLeft, HashMap<?, ?> mapRight) {
        HashMap<?, ?> result = new HashMap<?, ?>();
        Iterator<?> keyLeftIter = mapLeft.keySet().iterator();
        Iterator<?> keyRightIter = mapRight.keySet().iterator();
        String keyLeft;
        String keyRight;
        while (keyLeftIter.hasNext()) {
            keyLeft = keyLeftIter.next();
            while (keyRightIter.hasNext()) {
                keyRight = keyRightIter.next();

                if (keyLeft.compareTo(keyRight) < 0) {
                    result.put(keyLeft, mapLeft.get(keyLeft));
                    keyLeft = keyLeftIter.next();
                } else {
                    result.put(keyRight, mapRight.get(keyRight));
                    keyRight = keyRightIter.next();
                }
            }
        }
        return result;
    }

我感谢您的帮助!


问题答案:

像其他评论者一样,我建议您阅读Java中的泛型主题。您在合并中所做的是在结果HashMap上使用通配符

HashMap<?, ?> result = new HashMap<?, ?>();

当您在上面加上通配符时,您基本上是在说“我只会从中读取”。稍后,您尝试将某些内容推入

result.put(keyLeft, mapLeft.get(keyLeft));

编译器会说:“嘿,您刚刚告诉我,您只会阅读,现在您想在其中添加一些内容…失败

然后,它将生成您的编译时错误。

不要将通配符放在要修改的集合上。



 类似资料:
  • 问题内容: 我需要根据存储在其中的值对我进行排序。在包含存储在手机联系人的名字。 另外,我还要求在对值进行排序时对键进行自动排序,否则你可以说键和值绑定在一起,因此值的任何更改都应反映在键中。 要求的输出: 问题答案: 尝试下面的代码对我来说很好。你可以选择升序和降序 编辑:版本2 使用了新的Java功能,例如流for-each等 如果值相同,则地图将按键排序

  • 问题内容: 我以为HashMap是无序的,并且当遍历键时,您不知道命令的顺序是什么?在此示例中,看起来地图已经按键号排序: 输出: 问题答案: 是的,但不能保证维持该顺序。 来自Hashmap文档 此类 无法保证 地图的顺序。特别是,它不能保证顺序 会随着时间的推移保持恒定 。 您的基准还不足以决定它。 查看TreeMap是否需要排序顺序 根据地图的键的自然顺序或在地图创建时提供的Comparat

  • 考虑下面的哈希图: 具有诸如 我需要按值对hashmap进行降序排序,但如果值相等,则按键进行升序排序: 到目前为止,我试着分别按键排序,然后按值排序,但我不相信这种方法。除了创建更多的hashmaps之外,还有什么好方法呢?

  • 我有一个,其中的键是字符串。我需要获取这些键并根据键大小(即字符串长度)对其进行排序,然后将其存储在某个中。 注意:如果两个键的大小相同,那么我们可以把它放在任何顺序。 为(如)。

  • 问题内容: 我想在Swift中对字典进行排序。我有一本字典,例如: 等,我希望它像 等等 我在SO上尝试了许多解决方案,但没有人为我工作。我正在使用XCode6 Beta 5,在它上面有一些正在给编译器错误,在一些解决方案中有例外。因此,任何可以发布字典排序工作副本的人。 问题答案: 编辑: 上面代码中的排序数组仅包含键,而值必须从原始字典中检索。但是,也是(键,值)对的一对,我们可以使用全局函数

  • 我有一个字符串数组,由整数作为键标识。我想按键对这个HashMap进行排序。