2012-09-11 10 views
5

Şu anda okul ödevi için birlikte bir şaşırtma programı yapıyorum. Programın bir dosya okumasını sağlamaya çalışıyorum ve daha sonra dosyadaki her harfin yerine bir HashMap'dan aldığım karşılık gelen bir değerle yeni bir dosya oluşturmaya çalışıyorum. Bir sürü anahtar ve değer oluşturdum, ancak daha sonra yeni dosya yazma sürecinde haritanın yeni String'a eklenmeden önce bir anahtar içerip içermediğini kontrol etmeye çalışıyorum. Denetlenen karakterler aslında okumak için okuduğum dosyadadır ve dosya doğru okunur. Yine de encryptionDict.containsKey() (hashmap) yöntemimle başarısız oluyor.HashMap: includesKey() Ne zaman olması gerektiği doğru değil mi?

Bazı Java uzmanlarının bunu anlamaya yardımcı olabileceğini umuyorum! Oldukça clueless, daha çok C ve D erkeğiyim. Beni vuran tek düşünce, "foo" != "foo"'un nerede olduğu ile ilgili bir şey olurdu. Fakat chars nesne değildir.

Aşağıdaki kod pastebin olduğunu, bakmak için kilit parçalar sınıf yapıcısı, yöntem şifrelemek ve yöntem initDictionary olduğunu HashMap<char, String> geçersiz neden bir kullanmak zorunda çünkü, aynı zamanda birisi onu bana, söyleyebilir nesne?

kodu: http://pastebin.com/NcHTHPfw

+0

Hangi değerlerin başarısız olduğunu görmek için bir hata ayıklayıcı kullandınız mı? – Tudor

+0

Evet, Karakterler bana tümCharArray() dönüşümünü atlayalım gibi görünüyor. – BitPuffin

+0

Eh hayır yapmadım!Hata ayıklayıcısını nasıl kullanacağımı gerçekten bilmiyorum. Sadece bir breakpoint vb ayarlamak nasıl Ama ben – BitPuffin

cevap

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. 

Bu sorunlu biraz. Array, equals() ve hashCode() yöntemlerini geçersiz kılmadığından, Java'daki karma anahtarları olarak dizileri kullanamazsınız.

HashCode, aradığınız nesneyi içeren doğru kovayı bulmak için kullanılır ve equals() yöntemi, gerçek Nesneleri karşılaştırır. Bir HashMap'in kullanılması için, bu iki yöntemin mantıklı bir şekilde geçersiz kılınması gerekir; Bu yüzden char dizileri kullanmakta kesinlikle ısrar ederseniz yapabileceğiniz tek şey, bir char dizisi olan anahtar olarak bir sarmalayıcı sınıfını kullanmaktır. Böyle

şey:

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

Artık bir Map<Key, String> varsa ve bir Key Nesne Bould edebilir ya bir String veya sorun tüm char[] bakılmaksızın içindekiler, benzersiz olmasıdır bir char[]

+2

'String' deneyebilirsiniz bir char dizi için güzel bir sarıcı sınıftır :-) –

+0

Peki ben bir şekilde kullanmak istedim çünkü bir String üzerinde charAt çağırmak kolaydır Bir letterAt yöntemi ya da bir şey olmadığını utanç! – BitPuffin

+0

@FrankPavageau true, ancak bazen güvenlik nedenlerinden dolayı, String havuzu vb. Nedeniyle hassas yöntemlerde String kullanmak yasal değildir. –

2

. Görünüşe göre gerçekten bir String kullanmak istiyorsun. Normalde, yazabilir yerine char[]

kullanmadan böyle bir program yazabilirsiniz

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

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

Veya belki 'Karakter', çünkü tüm tuşlar aslında tek karakterler gibi görünüyor. –

0

, bunlar karşılaştırılabilir değildir, bu yüzden karşılaştırır zaman değeri

uymuyor anahtar olarak diziler kullanmayın
0

HashMap<char [], String> kullanıyorsunuz. Bu, .equals olarak çalışmıyor ve .hashCode dizilerde tanımlanmadı. Bu basit test programı verifiesthis: Eğer amaçlı Map<Character, String> kullanabilirsiniz

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

. Başka bir çözüm de, filecontent.charAt(index) ile endekslenen bir dizi dizgisi [MAX_INDEX] kullanmak olabilir - bu durumda MAX_INDEX küçük ('z' gibi) küçükse bu daha da basit olabilir.

İlgili konular