private HashMap<char [], String> initDictionary() {
HashMap<char [], String> d = new HashMap<char [], String>();
d.put("a".toCharArray(), "!\"#¤");
d.put("b".toCharArray(), "¤#\"!");
d.put("c".toCharArray(), "\"#¤%");
d.put("d".toCharArray(), "%¤#\"");
d.put("e".toCharArray(), "#¤%&");
d.put("f".toCharArray(), "&%¤#");
d.put("g".toCharArray(), "¤%&/");
d.put("h".toCharArray(), "/&%¤");
d.put("i".toCharArray(), "%&/(");
d.put("j".toCharArray(), "(/&%");
d.put("k".toCharArray(), "&/()");
d.put("l".toCharArray(), ")(/&");
d.put("m".toCharArray(), "/()=");
d.put("n".toCharArray(), "=)(/");
d.put("o".toCharArray(), "()=?");
d.put("p".toCharArray(), "?=)(");
d.put("q".toCharArray(), ")=?!");
d.put("r".toCharArray(), "!?=)");
d.put("s".toCharArray(), "=?!\"");
d.put("t".toCharArray(), "\"!?=");
d.put("u".toCharArray(), "?!\"#");
d.put("v".toCharArray(), "#\"!?");
d.put("w".toCharArray(), ";:*^");
d.put("x".toCharArray(), "^*:;");
d.put("y".toCharArray(), ":*^>");
d.put("z".toCharArray(), ">^*:");
// etc.
これが問題のビットです。Array は equals() および hashCode() メソッドをオーバーライドしないため、Java では配列をハッシュ キーとして使用できません。
hashCode は、探しているオブジェクトを含む正しいバケットを見つけるために使用され、equals() メソッドは実際のオブジェクトを比較します。HashMap を利用するには、これらのメソッドの両方を賢明な方法でオーバーライドする必要がありますが、配列クラスは final であるため、これはできません。したがって、char 配列の使用を絶対に主張する場合にできる唯一のことは、char 配列を持つキーとしてラッパー クラスを使用することです。
このようなもの:
public class Key {
private final char[] array;
public Key(final String string) {
this(string.toCharArray());
}
public Key(final char[] array) {
this.array = array;
}
public char[] getArray() {
return array;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Key key = (Key) o;
if (!Arrays.equals(array, key.array)) return false;
return true;
}
@Override
public int hashCode() {
return array != null ? Arrays.hashCode(array) : 0;
}
}
これで、 aまたは aから ObjectMap<Key, String>
を取得できます。Key
String
char[]