5

私は現在、学校の宿題のための難読化プログラムを一緒に投げています。プログラムにファイルを読み取らせてから、ファイル内の各文字を、から取得した対応する値に置き換える新しいファイルを作成しようとしていますHashMap。たくさんのキーと値を設定しましたが、新しいファイルを作成するプロセスの後半で、新しいファイルに追加する前に、マップにキーが含まれているかどうかを確認しようとしていますString。チェックされた文字は、実際に私がテストのために読み取っているファイルにあり、ファイルは正しく読み取られています。それでも、encryptionDict.containsKey()(私のハッシュマップ)メソッドでは失敗します。

Javaの専門家がこれを理解するのを手伝ってくれることを願っています!私はかなり無知です、私はもっとCとDの男です。私を驚かせた唯一の考えは、それがStringsのようなものになるだろうということでした"foo" != "foo"。しかし、charsはオブジェクトではありません。

コードは以下のペーストビンにあります。注目すべき重要な部分は、クラスコンストラクター、メソッドencrypt、およびメソッドです。また、オブジェクトを使用する必要があるため、initDictionaryなぜ無効なのかを誰かに教えてもらえますか?HashMap<char, String>

コード: http: //pastebin.com/NcHTHPfw

4

4 に答える 4

6
 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>を取得できます。KeyStringchar[]

于 2012-09-11T14:02:02.550 に答える
2

問題はchar[]、その内容に関係なく、すべてが一意であることです。あなたは本当に文字列を使いたいようです。通常、このようなプログラムは、char[]

代わりに、あなたは書くことができます

private Map<Character, String> initDictionary() {
Map<Character, String> d = new HashMap<Character, String>();

d.put('a', "!\"#¤");
// etc
于 2012-09-11T14:02:41.027 に答える
0

を使用していHashMap<char [], String>ます。これは、アレイでは機能せず、定義されて.equalsいません。.hashCodeこの簡単なテストプログラムはこれを検証します:

public static void main(String[] args) {
  char[] a = String.valueOf('a').toCharArray();
  char[] b = String.valueOf('a').toCharArray();

  System.out.println(a.hashCode() == b.hashCode());
}

Map<Character, String>あなたはあなたの目的のためにを使うことができます。別の解決策は、インデックスが付けられた配列String [MAX_INDEX]を使用することです。これはfilecontent.charAt(index)、MAX_INDEXが小さい('z'のように)場合はさらに簡単になる可能性があります。

于 2012-09-11T14:10:11.290 に答える
0

配列をキーとして使用しないでください。配列は比較できないため、比較すると値が一致しません。

于 2012-09-11T14:03:47.093 に答える