Java中存储多个键和值对的数据结构
晚上好, 我正在寻找一个优雅的解决方案来实现一个转换表,特别是一个通用的下推自动机,它对给定的转换使用多个离散值。他们说一幅画抵得上千言万语,所以这是我桌子的一部分:Java中存储多个键和值对的数据结构,java,data-structures,Java,Data Structures,晚上好, 我正在寻找一个优雅的解决方案来实现一个转换表,特别是一个通用的下推自动机,它对给定的转换使用多个离散值。他们说一幅画抵得上千言万语,所以这是我桌子的一部分: State InputSymbol StackSymbol Move(NewState, Action) ------------------------------------------------------------ 0 a Z0 (0
State InputSymbol StackSymbol Move(NewState, Action)
------------------------------------------------------------
0 a Z0 (0, push)
0 a a (0, push)
0 a b (0, pop)
0 b Z0 (1, push)
...
现在,我已经考虑过多维数组,数组列表中的数组列表,以及其他类似的解决方案,但所有这些看起来都相当残忍。由于表中未显示我的三个符号a、b和Z0的所有可能组合,这一点更加复杂
我一直在考虑使用HashMap,但我不完全确定如何使用多个键值。我曾考虑将所有三个符号连接在一起,并使用生成的字符串作为键,但这似乎也不够优雅
而且,作为记录,这是一个家庭作业,但实际上给出一个优雅的解决方案并不是严格要求的。我只是喜欢好的代码
提前感谢您的帮助。将{State,inputsymble,StackSymbol}封装在对象中。然后,使用对象的哈希代码作为哈希表的键。有关哈希代码的更多信息,请参见。创建如下类:
class Key{
int state;
char inputSysmbol;
String StackSymbol;
}
然后使用地图
像上面一样为Move创建一个类,不要忘记在这两个类中都使用方法。查看来自Jakarta commons collections框架的MultiHashMap。 不幸的是,雅加达集合框架没有参数化,即不支持泛型,因此您必须强制转换您的特定类型 另一个解决方案是实现类似于你自己的东西。创建保存数据的类移动。创建封装逻辑的类表。此类可能包含移动列表和N个映射: 地图>状态索引 映射>输入符号索引 等等等等 add方法的实现非常简单。 get的实现更有趣:
public Move get(Integer state, Character inputSymbol, StackSymbol stackSymbol) {
List<Move> stateList = stateIndex.get(state);
List<Move> inputSymbolList = stateIndex.get(inputSymbol);
List<Move> stackSymbolList = stateIndex.get(stackSymbol);
Set<Move> result = new HashSet<Move>(stateList);
result.retainAll(inputSymbolList);
result.retainAll(stackSymbolList);
if (result.size() > 1) {
throw new IllegalStateException("Unique constraint violation");
}
return result.size() == 0 ? null : result.interator().next();
}
嗯,肯定是我以前没考虑过的。出于好奇,get的时间复杂度是多少?多列表操作似乎会相当昂贵。啊,所以这个双关语的关键是封装我的所有数据,然后覆盖hashcode和equals。Equals看起来很简单,但是我如何实现一个仍然快速的健壮哈希代码呢?顺便说一句,我肯定会使我的关键对象不可变。理想情况下,我希望能够将输入从单个字符扩展到字符串。我想没有比摘要算法更简单的方法了?@phobos51594:对于hashcode实现,请阅读本书。