是否有一个带有索引,键和对象的Map对象?爪哇

时间:2018-08-24 18:52:34

标签: java list dictionary encryption hashmap

我正在尝试用Java模拟一个谜机的转子。 我需要一个带有索引,键和对象的对象,因为我没有像这样尝试HashMaps:

private HashMap<Integer,Integer> rotorWiring = new HashMap<Integer, Integer();
private HashMap<Integer,Integer> reverseRotorWiring = new HashMap<Integer, Integer>();

//The "wiring" of the rotor is set from a String,
    public void setRotorWiring(String Wiring) {
    if (Wiring.length()==26) {
        for (int i=0; i<Wiring.length();i++ ) {
            char tempChar = Wiring.charAt(i);
            int valueOfChar = (int)tempChar-64; 
            if (valueOfChar<=26){
                this.rotorWiring.put(i+1,valueOfChar);
                this.reverseRotorWiring.put(valueOfChar,i+1);
            }
        }
    }

}

到目前为止,效果很好,这使我可以翻译e.x。从A到E,但是,一旦我尝试像这样模拟转子的转弯:

//It should be mentioned that I designing the program to only accept characters a to z inclusive.
public void turn() {
    for (int i=1;i<=rotorWiring.size();i++) {
        if (i!=26) {
            rotorWiring.replace(i, rotorWiring.get(i+1));
        }
        else {
            rotorWiring.replace(i, rotorWiring.get(1));
        }
    }
    for (int i=1;i<=rotorWiring.size();i++) {
        if (i!=26) {
            reverseRotorWiring.replace(i, rotorWiring.get(i+1));
        }
    }
}

但是,我注意到这更像是模拟转子内部布线的偏移而不是转弯……我想要一个带有索引,键和对象的类似于“地图”的解决方案,因为那样会请允许我将所有键和对象的索引偏移1,从而模拟转弯。

但是,我愿意就此问题的不同解决方案提出建议。

应该提到的是,我是个新手,因此很欣赏深入的解释。

非常感谢。

2 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow。没有在JDK中描述的实现。但是,还有更多方法可以实现Integer-String-Object的存储。请注意,索引和键在定义上都是唯一的。另外,请注意索引键是紧密耦合的。您可能想将Map放在另一个Map上:

Map<Integer, Map<String, MyObject>> map;

或将收集特征用于索引:

List<Map<String, MyObject>>

在删除会更改所有后续元素索引的项目时要小心-用null代替它以保留索引。另外,您可以使用索引/键为定义的对象创建装饰器:

Map<Integer, MyDecoratedObject> map;

MyDecoratedObject如下所示:

public class MyDecoratedObject {

     private final String key;      // or int index
     private final MyObject delegate;

     // Full-args constructor, getters
}

最后,取决于您的方式是最能满足您要求的方式。

答案 1 :(得分:0)

使用地图作为解决方案!这样解决了:

    private HashMap<Integer,HashMap<Integer,Integer>> rotorWiring = new HashMap<Integer, HashMap<Integer,Integer>>();
    private HashMap<Integer,HashMap<Integer,Integer>> reverseRotorWiring = new HashMap<Integer, HashMap<Integer,Integer>>();

    public void setRotorWiring(String Wiring) {
    if (Wiring.length()==26) {
        for (int i=0; i<Wiring.length();i++ ) {
            HashMap<Integer, Integer> wire = new HashMap<Integer, Integer>();
            HashMap<Integer, Integer> reverseWire = new HashMap<Integer, Integer>();
            char tempChar = Wiring.charAt(i);
            int valueOfChar = (int)tempChar-64; 
            if (valueOfChar<=26){
                wire.put(i+1,valueOfChar);
                reverseWire.put(valueOfChar,i+1);
                rotorWiring.put(i, wire);
                reverseRotorWiring.put(i, reverseWire);
            }
        }
    }

}
相关问题