2012-09-11 15 views
5

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

私はいくつかのJavaのエキスパートが私にこれを理解させてくれることを願っています!私はかなり無知だ、私はCとDの男の多くです。私を襲った唯一の考えは、それが文字列のようなものになるということだった。"foo" != "foo"。しかし、文字はオブジェクトではありません。

コードは下のペーストビンにあります。見たいキーパーツは、クラスコンストラクタです。メソッドは暗号化されており、メソッドinitDictionaryも、誰かが私にはHashMap<char, String>が無効な理由を教えてもらえますか?オブジェクト?

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

+0

デバッガを使用して、失敗した値を確認しましたか? – Tudor

+0

ええ、それは文字のように私は全体をスキップしてみましょうChArArray()変換 – BitPuffin

+0

私はしなかった!私はデバッガの使い方を知らない。しかし、私は試してみることができます – BitPuffin

答えて

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を使用するには、これらのメソッドの両方を適切な方法でオーバーライドする必要があります。これは、配列クラスが最終的であるため不可能です。だから、もしあなたが絶対にchar配列を使うことを主張するならば、あなたができる唯一のことは、ラッパークラスをchar配列を持つキーとして使うことです。このような

何か:今、あなたはMap<Key, String>を持っているとStringまたはchar[]

+2

'String'はchar配列の素敵なラッパークラスです:-) –

+0

文字列でcharAtを呼び出すのは簡単なので、何とかcharを使用したいと思っていました。恥知らず、レターのような方法はありません! – BitPuffin

+0

@FrankPavageau実際にはセキュリティ上の理由から、文字列プールなどのために敏感なメソッドでStringを使用することは合法ではありません。 –

2

のいずれかからKeyオブジェクトをbouldでき

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; 
    } 
} 

問題はすべてchar[]は関係なく、その内容の、ユニークであるということです。本当に文字列を使いたいと思うようです。通常、あなたが書くことができます代わりにchar[]

を使用せずに、このようなプログラムを書くことができ

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

d.put('a', "!\"#¤"); 
// etc 
+3

あるいは、おそらく 'Character'です。なぜなら、すべてのキーは実際には単一の文字だからです。 –

0

、彼らは比較できないので、それは比較したときに値が

と一致しないキーとして配列を使用しないでください
0

HashMap<char [], String>を使用しています。 .equals.hashCodeは配列に定義されていないため、これは機能しません。この単純なテストプログラムはverifiesthis:あなたはあなたの目的のためにMap<Character, String>を使用することができます

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()); 
} 

。もう1つの解決策は、filecontent.charAt(index)によってインデックス付けされた配列文字列[MAX_INDEX]を使用することです。MAX_INDEXが小さい場合( 'z'など)は、さらに簡単です。

関連する問題