我正在尝试用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,从而模拟转弯。
但是,我愿意就此问题的不同解决方案提出建议。
应该提到的是,我是个新手,因此很欣赏深入的解释。
非常感谢。
答案 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);
}
}
}
}