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实现,请阅读本书。