你好,我需要实现一个接收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进行排序。