【问题标题】:how to order random values by hashcode in hashmap如何在哈希图中通过哈希码对随机值进行排序
【发布时间】:2012-01-27 17:57:39
【问题描述】:

我有一个简单的类,它填充了一个简单的 hashmap 我想通过 hashcode 对值进行排序怎么做?

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

    public class Ch11Ex18 {
        public static void main(String[] args) {
            Random rand = new Random(47);
            Map<Integer,Integer> m = new HashMap<Integer,Integer>();
            for(int i = 0; i < 10000; i++) {
              // Produce a number between 0 and 20:
              int r = rand.nextInt(20);
              Integer freq = m.get(r);
              m.put(r, freq == null ? 1 : freq + 1);

            }
            System.out.println(m);
          }
    }

【问题讨论】:

  • 排序值在哪里?只是打印它们?获取键,对其进行排序,对其进行迭代,然后转储值。
  • proly 导出到列表并制作一个使用 hashCode() 的比较器

标签: java hashmap hashcode


【解决方案1】:

你不知道:HashMap 本质上是无序的。

您可以将TreeMap 与自定义比较器一起使用,但是您应该注意,如果您使用具有相同哈希码的不相等对象,则只有其中一个对象最终会出现在地图中......即使这样也会按而不是按值排序。

您可以创建一个包含值副本的 ArrayList&lt;Integer&gt;,然后对 进行排序 - 但是您将没有密钥。

您可以创建一个包含条目副本的ArrayList&lt;Map.Entry&lt;Integer, Integer&gt;&gt;,然后对其进行排序……但实际上,有什么意义呢?

从根本上说,这是一件很奇怪的事情——哈希码应该这样使用,基本上。它们不是唯一的,不应该被视为随机性的来源,等等。无论这里的大局如何,几乎肯定会有更好的方法。

【讨论】:

    【解决方案2】:

    TreeMap 按键排序。

    Map yourMap= new HashMap();
    // Enter values
    Map sortedMap = new TreeMap(yourMap);
    

    【讨论】:

      【解决方案3】:

      在您的情况下,由于Integer.hashCode() 等于实际数字,您只需将映射插入TreeMap,它们就会被相应地排序。

      【讨论】:

      • +1 这个答案比我的(现已删除)更短更完整。
      【解决方案4】:

      HashMap 的迭代顺序是键的哈希码的自然顺序(因为哈希值决定了桶,桶是按顺序迭代的),所以你可以只迭代map.keySet()。对于键类型Integer,哈希码等于Integer的实际值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        • 2015-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        相关资源
        最近更新 更多