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