【问题标题】:Using a HashMap's/HashSet's hashCode() function to sort data使用 HashMap 的/HashSet 的 hashCode() 函数对数据进行排序
【发布时间】:2019-04-08 06:14:16
【问题描述】:

我一直在尝试想出创造性的方法来使用散列函数和散列图。现在我正在弄清楚是否有一种方法可以通过强制碰撞来存储和排序数据。

例如,输入是一个巨大的字符串列表,目标是打印出每个长度为 X 的字符串。如果我使用 HashCode 将所有字符串存储在 HashSet 中...

  @Override
   public int hashCode() {
       return s.length();
   }

然后我会将所有内容都按其长度编入索引。然后理论上如果我想要所有长度为 3 的字符串,我会得到索引为 3 的字符串列表。

如何在索引中获取列表?这会是个好主意吗?

【问题讨论】:

  • 哈希不是为排序而设计的。它们专为快速查找和检索而设计。
  • 不要对hashCode 做任何事情,除非作为确定两个对象是否不相等的方法。基于哈希码排序只是方法的误用。
  • HashSet 和 HashMap 都不是索引集合。如果您想要所有长度为 3 的字符串,请创建一个 HashMap>,其中键是长度,值是所有具有相同长度的字符串的列表。
  • 同意前面的cmets。如果你想做这样的事情,不要覆盖hashCode(),而是将它们放在Lists 的List 中,以String 的长度作为索引插入第一个列表。在任何情况下,你都不能继承String,那么类就是final。过度使用Map,其中 key 是 JB Nizet 所说的长度。

标签: java hash hashmap hashset


【解决方案1】:

这不是hashcode() 的目标。此外,在 HashMaps 中,对象未排序。在内部是的,因为它们存储在数组中(通过哈希码的提醒),但是该类不为您提供任何通过索引对其元素的访问。

但您可以扩展 Map<Integer, List<String>> ,您可以将长度 n 映射到长度为 n 的字符串列表,并实现此附加方法:

public void add(String s) {
    // null check here 
    List<String> list = get(s.length);
    if (list == null) {
        list = new ArrayList<>();
        put (s.lenght, list);
    }
    list.add(s);
}

然后像这样使用它:

map.add("hello");
map.add("world");
map.add("knife");
map.add("good");
map.add("day");
map.get(5); // return list of hello, world, knife

【讨论】:

  • 没有必要“扩展”任何Map。使用map.computeIfAbsent(someString.length(), k -&gt; new ArrayList&lt;&gt;()).add(someString); 就足够了。
猜你喜欢
  • 2016-05-28
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多