Java对象的多个哈希代码

Java对象的多个哈希代码,java,group-by,hashmap,hashcode,Java,Group By,Hashmap,Hashcode,我试图优化一些代码,当我这样做的时候,我通常会从散列结构中得到帮助 我想做的是根据一些属性以非常快的方式将对象划分为多个集合。基本上类似于SQL GROUP BY语句,但适用于Java 问题是我想使用HashMap来实现这一点。我想使用多种分组方式,但一个对象只能有一个hashCode() 是否有一种方法可以使用多个hashCodes(),以便能够通过多种方法进行分组?有没有其他结构可以解决这类问题?我是否可以使用Java 8 lambda表达式在HashMap参数中发送hashCode()?我

我试图优化一些代码,当我这样做的时候,我通常会从散列结构中得到帮助

我想做的是根据一些属性以非常快的方式将对象划分为多个集合。基本上类似于SQL GROUP BY语句,但适用于Java

问题是我想使用
HashMap
来实现这一点。我想使用多种分组方式,但一个
对象只能有一个
hashCode()

是否有一种方法可以使用多个
hashCodes()
,以便能够通过多种方法进行分组?有没有其他结构可以解决这类问题?我是否可以使用Java 8 lambda表达式在
HashMap
参数中发送
hashCode()
?我是不是很傻,有一种超快速的方法不是这么复杂


注意:我想要的哈希代码使用多个非常量属性。例如,创建一个唯一表示这些属性的字符串是行不通的,因为我每次都必须刷新字符串。

您所描述的内容听起来像是一个相当复杂的模式,可能是一个错误。如果您想问一个关于如何在Java中高效地复制
groupby
样式的查询的问题,您可能会更幸运

也就是说,拥有多个哈希代码的最简单方法是拥有多个类。下面是一个简单的例子:

public class Person {
  String firstName;
  String lastName;

  /** the "real" hashCode() */
  public int hashCode() {
    return firstName.hashCode() + 1234 * lastName.hashCode();
  }
}

public class PersonWrapper1 {
  Person person;

  public int hashCode() {
    return person.firstName.hashCode();
  }
}

public class PersonWrapper2 {
  Person person;

  public int hashCode() {
    return person.lastName.hashCode();
  }
}
通过使用包装类,您可以以类型安全的方式重新定义相等的概念。只是要注意你到底是如何让这些类型相互作用的;您只能将
Person
PersonWrapper1
PersonWrapper2
的实例与相同类型的其他实例进行比较;如果传入了不同的类型,则每个类'
.equals()
方法应返回
false


您还可以查看,它们提供了几个不同的哈希函数,以及一个实现,这是一个依赖于能够使用多个哈希函数的数据结构

这是通过将散列函数抽象为
漏斗
类来实现的<代码>漏斗
-可编程类只需将它们用于相等的值导入
漏斗
,调用方(如
BloomFilter
)即可实际计算哈希代码



你的最后一段令人困惑;您不能希望将对象存储在基于哈希的数据结构中,然后更改用于计算哈希代码的值。如果这样做,对象将不再在数据结构中被发现。

您所描述的内容听起来像是一个相当复杂的模式,可能是一个错误。如果您想问一个关于如何在Java中高效地复制
groupby
样式的查询的问题,您可能会更幸运

也就是说,拥有多个哈希代码的最简单方法是拥有多个类。下面是一个简单的例子:

public class Person {
  String firstName;
  String lastName;

  /** the "real" hashCode() */
  public int hashCode() {
    return firstName.hashCode() + 1234 * lastName.hashCode();
  }
}

public class PersonWrapper1 {
  Person person;

  public int hashCode() {
    return person.firstName.hashCode();
  }
}

public class PersonWrapper2 {
  Person person;

  public int hashCode() {
    return person.lastName.hashCode();
  }
}
通过使用包装类,您可以以类型安全的方式重新定义相等的概念。只是要注意你到底是如何让这些类型相互作用的;您只能将
Person
PersonWrapper1
PersonWrapper2
的实例与相同类型的其他实例进行比较;如果传入了不同的类型,则每个类'
.equals()
方法应返回
false


您还可以查看,它们提供了几个不同的哈希函数,以及一个实现,这是一个依赖于能够使用多个哈希函数的数据结构

这是通过将散列函数抽象为
漏斗
类来实现的<代码>漏斗-可编程类只需将它们用于相等的值导入
漏斗
,调用方(如
BloomFilter
)即可实际计算哈希代码



你的最后一段令人困惑;您不能希望将对象存储在基于哈希的数据结构中,然后更改用于计算哈希代码的值。如果这样做,对象将不再在数据结构中被发现。

假设您有一个对象集合,并且希望生成类似于SQL GROUP BY的不同分组。每个group by由一组公共值定义。为每个不同的分组类型创建一个group by key类,每个类型都有一个适当的
hashCode()
equals()
方法(根据
Map
合同的要求)

对于以下伪代码,我假设存在一个
MultiMap
类,该类封装了映射的
列表
值的管理。您可以使用Guava的
MultiMap
实现

// One group key
public class GroupKey1 {
    ...
    public GroupKey1(MyObject o) {
        // populate key from object
    }
    public GroupKey1(...) {
        // populate from individual values so we can create lookup keys
    }
    public int hashCode() { ... }
    public boolean equals() { ... }
}

// A second, different group key
public class GroupKey2 {
    ...
    public GroupKey2(MyObject o) {
        // populate key from object
    }
    public GroupKey2(...) {
        // populate from individual values so we can create lookup keys
    }
    ...
}
...
MultiMap<GroupKey1,MyObject> group1 = new HashMultiMap<>();
MultiMap<GroupKey2,MyObject> group2 = new HashMultiMap<>();

for (MyObject m : objectCollection)
{
    group1.put(new GroupKey1(m), m);
    group2.put(new GroupKey2(m), m);
}
...
// Retrieve the list of objects having a certain group-by key
GroupKey2 lookupKey = new Groupkey2(...);
Collection<MyObject> group = group2.get(lookupKey);
//一个组密钥
公共类GroupKey1{
...
公共组密钥1(MyObject o){
//从对象填充密钥
}
public GroupKey1(…){
//从单个值填充,以便我们可以创建查找键
}
public int hashCode(){…}
公共布尔等于(){…}
}
//第二个不同的组密钥
公共类GroupKey2{
...
公共组密钥2(MyObject o){
//从对象填充密钥
}
公共组密钥2(…){
//从单个值填充,以便我们可以创建查找键
}
...
}
...
MultiMap group1=新的HashMultiMap();
MultiMap group2=新的HashMultiMap();
对于(MyObject m:objectCollection)
{
组1.put(新组键1(m),m);
组2.put(新组键2(m),m);
}
...
//按键检索具有特定组的对象列表
GroupKey2 lookupKey=新的GroupKey2(…);
集合组=group2.get(lookupKey);

假设您有一个对象集合,并且希望生成类似于SQL GROUP BY的不同分组。每个group by由一组公共值定义。为每个不同的分组类型创建一个group by key类,每个类型都有一个适当的
hashCode()
equals()
方法(根据
Map
合同的要求)

对于以下伪代码,我假设存在一个
MultiMap