Java 可以使用不同索引的数据结构

Java 可以使用不同索引的数据结构,java,data-structures,Java,Data Structures,我想知道Java中是否存在允许用户使用不同索引的数据类型/结构。因此,它就像一个哈希映射(例如,HashMap),但它不只是使用字符串作为索引,而是允许用户使用字符串或浮点数,其中可以使用或。例如: <"Hello", _> -> 123 <"Hello", 10.5f> -> 123 <_, 10.5f> -> 123 <"World, _> -> 456 ->123 -> 123 -> 123 惯例是使用新的、特

我想知道Java中是否存在允许用户使用不同索引的数据类型/结构。因此,它就像一个哈希映射(例如,
HashMap
),但它不只是使用字符串作为索引,而是允许用户使用字符串或浮点数,其中可以使用或。例如:

<"Hello", _> -> 123
<"Hello", 10.5f> -> 123
<_, 10.5f> -> 123 

<"World, _> -> 456
->123
-> 123
-> 123 

惯例是使用新的、特定的索引创建一个单独的数据结构

这意味着(在Java中)现在必须将数据存储两次,但在某些用例中,这可能更可取


或者在实践中,设计/需要多个数据结构在不同的键上建立索引通常意味着有人想要一个关系数据库,而不是Java中的任何东西,这可能是最干净的方法。

更脏的方法是将所有可能的键串接在一起,例如:

float number = 10.5f;
String key = "Hello" + number;
map.put(key, 123);

更干净的解决方案是设计一个类,该类将是散列映射中的一个键。在这种情况下,您需要重写
hashCode()
equals()
——这是由于HasmMap实现所必需的。请参阅以下文章:

您可以使用
HashMap
,这样“索引”就可以成为一切。尝试和学习hashCode()/equals()契约做得很好。如果“关键对象”状态为“最终”且始终具有相同类型的值,则仍然可以使用贴图。也就是说,一个字符串和一个浮点数。这意味着你总是需要字符串和浮点数同时出现?您可以使用或?看起来您希望通过String类型的键或Float类型的键查找值。如果是这样,您是否考虑过只使用两个单独的映射-一个由字符串键控,另一个由浮点键控?尤其是在所有情况下(从您的示例中),您似乎都没有这两个选项。旁白:使用浮点数作为贴图的键有点奇怪,因为您必须精确查找首先放入贴图中的浮点数值。谢谢您的回答!我试图避免使用关系数据库,但这似乎是最好的选择。问题是有时浮点或字符串可能不存在,因此我需要能够省略其中一个,并仍然哈希到同一项。在这种情况下,您应该定义自己的类作为键。Re“问题是…”。你只需要一张地图就可以做到这一点。您只需使用两个键将值
put()
放入映射,例如,两次调用
put()
。当您使用其中一个键进行检索时,地图将起作用。(假定您失去了键的类型安全性,即编译器不会停止使用第三种键类型以及字符串和浮点)。如果您想限制映射中可以包含的内容,可以将映射隐藏在具有类型安全方法的自定义类中:
put(String,Integer)
put(Float,Integer)
-甚至可能
put(String sKey,Float fKey,Integer value)
。顺便说一句,当使用
get()
从映射中读取时,没有编译器检查所使用的键。这是因为(检查Javadocs)签名是
map.get(Object key)
。在Java中添加泛型时,这是必要的,以避免现有代码中的编译失败。