将已排序的hashmap的键值存储在string []中

时间:2011-09-14 10:33:31

标签: java hashmap

我很抱歉发布这个不明确的问题。这是我第一次使用hashmap,因此我很困惑。试图以更好的方式解释这个问题 - store key values of hashmap in string[]

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

上的hashmap进行排序

要提取密钥数组,我试过

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

(这里的hm是散列图)

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


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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

我有一个基于值的排序哈希映射。   我已经根据值

对哈希映射进行了排序

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

  

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

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

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

答案 3 :(得分:0)

试试这个:

public static void main(String[] args) {
    Map<String, String> hm = new TreeMap<String, String>();
    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

答案 4 :(得分:0)

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

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


  

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

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

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