繁体   English   中英

在字符串[]中排序的hashmap的Sstore键值

[英]Sstore key-values of sorted hashmap in string[]

我很抱歉发布这个不明确的问题。 这是我第一次使用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<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

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

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


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM