什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
我们是否可以使用一个键和两个值来实现HashMap.就像HashMap一样?
请帮助我,还告诉(如果没有办法)任何其他方式来实现三个值的存储,其中一个作为键?
我只是想知道为什么在类的hashCode()方法中使用素数?例如,当使用Eclipse生成我的hashCode()方法时,总会使用素数31:
public int hashCode() {
final int prime = 31;
//...
}
Run Code Online (Sandbox Code Playgroud)
参考文献:
这是关于Hashcode的一篇很好的入门文章和关于我如何找到哈希工作的文章(C#但概念是可转移的): Eric Lippert的GetHashCode指南和规则()
我认为我的问题与此类似:如何使用多个键实现Map?但有一个重要的区别.在那个问题中(如果我对它的理解是正确的,请告诉我,如果不是这样),键应该始终是唯一的.我希望在表单中有一个Map: MyMap ,其中键不一定是唯一的.如果这没有意义,我基本上想要一个二维数组,而不是通过坐标引用元素,我想通过成对的对象来引用它们.
任何人对这个有效的图书馆或自己实施的好方法都有任何想法吗?对于图书馆来说,我看过Apache Commons和Guava,似乎没有我想要的东西.
我们的应用程序将大量数据存储在许多不同类型的映射中,以便快速查找.为了保持简单(并且不考虑原始地图),它总是带有一个或多个键的地图.性能是我们的一大要求.
我想找到性能最好的地图实现,正如这里建议的那样,我对这些实现进行了比较:
基于java.util.HashMap的Maps(嵌套映射)专用于3个键的映射:
Map<K1, Map<K2, Map<K3, V>>>
Run Code Online (Sandbox Code Playgroud)java.util.HashMap中的包装密钥(元组作为键)
Map<Triple<K1, K2, K3>, V>
Run Code Online (Sandbox Code Playgroud)元组作为net.openhft.koloboke.collect.map.hash.HashObjObjMap中的键,根据这应该是(一个)最快的映射.
HashObjObjMap<Triple<K1, K2, K3>, V>
Run Code Online (Sandbox Code Playgroud)Benchmark Mode Cnt Score Error Units
TupleVsNestedMapsBenchmark.benchGetFromNestedMap avgt 20 11.586 ± 0.205 ns/op
TupleVsNestedMapsBenchmark.benchGetFromTupleKolobokeMap avgt 20 18.619 ± 0.113 ns/op
TupleVsNestedMapsBenchmark.benchGetFromTupleMap avgt 20 8.985 ± 0.085 ns/op
TupleVsNestedMapsBenchmark.benchPutToNestedMap avgt 20 15.106 ± 0.142 ns/op
TupleVsNestedMapsBenchmark.benchPutToTupleKolobokeMap avgt 20 22.533 ± 0.335 ns/op
TupleVsNestedMapsBenchmark.benchPutToTupleMap avgt 20 8.884 ± 0.084 ns/op
Run Code Online (Sandbox Code Playgroud)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(100000) …Run Code Online (Sandbox Code Playgroud) 在一种称为有限元方法的算法中,将连续区域离散化为具有一致几何的重复区域,在该区域上基于它们之间的连续性假设形成链接方程.
在这种情况下,我选择将形状划分为任意网格,现在我尝试将元素的值连接在一起,因为我遍历元素.这是我正在讨论的网格类型的示例:
有一堆相关的指数:
0..ROWS*2.0..ROWS*COLS.0..2.为了进入算法的下一步,我需要迭代每个节点并计算由局部元素索引索引的一些值的总和,并将它们存储在另一个矩阵中.例如,如果我在节点8上,我的元素查找/访问功能是一般的V(el_index, start_vertex, end_vertex),我的输出矩阵是S(start_node, end_node):
S(8,8) = V(el_14, vert_1, vert_1) + V(el_15, vert_1, vert_1) + V(el_04, vert_0, vert_0) + V(el_03, vert_0, vert_0) + V(el_2, vert_2, vert_2) + V(el_13, vert_2, vert_2)S(8,9) = V(el_15, vert_1, vert_2) + V(el_4, vert_0, vert_2)等等,对于来自节点8的所有连接(蓝绿色线).(连接是对称的,所以一旦我计算S(7,8),我就不需要计算S(8,7).)
问题是,网格(以及其他所有其他)在运行时被参数化,因此哪个节点索引+邻接方向对应于动态确定哪个元素索引.我需要告诉程序,"获取元素索引,其中节点索引vert_x是我当前的节点索引." 这是指示程序访问哪个元素的指令V().
有没有办法在Rust中以简单透明的方式将这些索引联系起来?
HashMap由每个三角形元素的不同顶点键入的s,保持每个顶点的值,但问题是相邻的三角形共享顶点数和空间坐标.HashMap用多个键来键入一个键,但Rust文档没有说任何关于HashMap多键的说法.