【问题标题】:can I copy an array to a hash table?我可以将数组复制到哈希表吗?
【发布时间】:2011-05-12 19:58:18
【问题描述】:

我有一个数组,它的元素是浮动的。我怎样才能将这个数组复制到哈希表中?

谢谢

【问题讨论】:

  • 哈希表只有在你有两个要关联的值时才有意义。
  • 哈希表的用途是什么?什么是键/值对?
  • 哈希表将键映射到值 - 你有一个浮点数组。您知道如何生成密钥吗?

标签: java arrays collections hashtable


【解决方案1】:

您可以轻松地将它们放入 Hashtableint -> float。以下方法将使用它们在数组中的索引作为键。

float[] arr;
Hashtable<Integer, Float> table = new Hashtable<Integer, Float>(arr.length);
for (int i = 0; i < arr.length; i++) {
    table.put(i, arr[i]);
}

【讨论】:

  • 为什么有人可能需要这样做?
  • @khachik,也许他们会添加具有不同 int 值的新值作为键...(我不知道)
  • 我认为,当我想在数组中查找重复值时,它将具有 O(nlogn) 但将数组对应到哈希表时,我可以在 O(n) 中获得我的重复数字。对吗?
  • @user,那么你想要一个Set。请参阅@Bozho 的回答。
  • @user:您应该在问题中包含这些说明。设置路线并不能真正帮助您检测哪些值是重复的;它只告诉你是否有重复(通过之后比较大小)。 Map 一个很好的解决方案,用于查找哪些是重复的,映射 Float->Integer。看我的回答。
【解决方案2】:

Hashtable 实现了 Map,因此您需要将每个浮点数与某个键配对。

【讨论】:

  • 与答案相比,这似乎更适合作为评论。
【解决方案3】:

一个数组不能直接对应一个Map。可以对应一个集合。

new HashSet(Arrays.asList(array))

【讨论】:

    【解决方案4】:

    鉴于 OP 在 jjnguy 的回答中澄清了他/她的要求,这是一种 O(n)(摊销)方法来计算浮点数组中唯一值的出现次数:

    float[] values;
    Map<Float, Integer> occurrences = new HashMap<Float, Integer>();
    for ( float f : values ) {
        int count = occurrences.containsKey(f) ? occurrences.get(f) : 0;
        occurrences.put(f, count+1);
    }
    
    //then find multiple occurrences by finding entries with a value > 0
    for ( Entry<Float, Integer> entry : occurrences.values() ) {
        if ( entry.getValue() > 1 ) {
           System.out.println("Duplicate: " + entry.getKey());
        }
    }
    

    在实践中,使用浮点数作为任何东西的键,或者以假装它是离散值的方式使用浮点数通常是很臭的。浮点类型通常用于模拟“连续”值,其中 7.000000000012 应被视为与 7.000000000013 相同。

    【讨论】:

      【解决方案5】:

      如果您想知道数组中有多少个不同的浮点值,最好的解决方案是多重集(通常构建在Map&lt;T, Integer&gt; 之上)。使用Guava,您可以这样做:

      float[] floats = ...
      Multiset<Float> multiset = HashMultiset.create(Floats.asList(floats));
      for (Multiset.Entry<Float> entry : multiset.entrySet()) {
        Float value = entry.getElement();
        int count = entry.getCount();
        ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 2013-01-10
        • 2012-12-25
        • 2011-05-19
        • 1970-01-01
        相关资源
        最近更新 更多