字符串中已排序的hashmap的Sstore键值

我很抱歉发布这个不明确的问题。 这是我第一次使用hashmap,因此我很困惑。 试图以更好的方式解释这个问题 – 在string []中存储hashmap的键值

我有一个基于值的排序哈希映射。 我想从有序映射中提取键并将它们存储在String []数组中。 键的顺序(按值排序)很重要。 我用这段代码对值的hashmap进行排序 – http://www.xinotes.org/notes/note/306/

为了提取密钥数组,我试过了

String[] keys = (String[])( hm.keySet().toArray( new String[hm.size()] ) ) 

(这里的hm是hashmap)

但这种方法不起作用。 键字符串[]具有键但不是我想要的排序顺序。


更新:我使用了linkedHashMap,并能够将排序的键值存储在数组中。 这是代码的链接。

根据拼写错误以及您使用hashmap的说明,密钥检索的顺序与插入顺序不一致。 使用LinkedHashMap。 这是使用您进行外部排序,然后将已排序的条目插入到地图中。

如果要在将条目插入Map时对其进行排序,请使用TreeMap。 您可以使用自定义比较器或使您的密钥对象实现Comparable接口。

HashMap使用key.hashValue()对值进行排序。 请改用TreeMap。

我有一个基于值的排序哈希映射。 我已根据值对哈希映射进行了排序

不,你没有。 HashMap根本没有排序。 您可以将values()作为Collection获取,并且可以按照您喜欢的方式对其进行排序,但它不会对HashMap本身进行排序。

但这种方法不起作用。 它以随机方式存储密钥。

它没有被定义为做任何不同的事情,特别是因为你根本没有对HashMap进行排序。

你需要澄清你在这里谈论的内容。 如果要对值进行排序,请执行以上操作。 如果要对键进行排序,请使用keys()而不是values() ‘进行上述操作。 如果希望Map本身按键排序,请使用TreeMap。 如果您希望Map本身按值排序,运气不好,则不能。

试试这个:

 public static void main(String[] args) { Map hm = new TreeMap(); hm.put("AAA", "typeAAA"); hm.put("BBB", "typeBBB"); hm.put("ABB", "TypeABB"); String[] keys = hm.keySet().toArray(new String[0]); for (String key : keys) { System.out.println("key: " + key); } } 

输出将是:

 key: AAA key: ABB key: BBB 

看起来您希望HashMap的键的顺序与键的排序列表相同。 这根本不可能HashMap的密钥由哈希表算法确定; 例如,复杂的过程取决于密钥的散列值以及插入和删除的顺序。

您将获得的最接近的是创建LinkedHashMap ,并通过按排序键的顺序插入旧HashMap中的条目来填充它。 如果然后迭代LinkedHashMap的键,您将按照它们的插入顺序返回它们。 但这是一个重量级的解决方案,如果你随后必须在“已排序”的地图中添加更多条目,它就会崩溃。 最好只使用TreeMap


我不想对hashmap进行更改。 我只是想按照排序值的顺序得到一个带有键的数组。

在这种情况下,您只需要将HashMap的密钥提取到一个数组中并对其进行排序。 该代码已在其他答案中给出。

另一方面,如果你想做某事以便地图的键总是以排序顺序出现(你似乎在其他评论中说的那样),那么你正在改变地图。