2012-09-11 26 views
5

मैं वर्तमान में स्कूल के होमवर्क के लिए एक obfuscation कार्यक्रम फेंक रहा हूँ। मैं प्रोग्राम को एक फ़ाइल पढ़ने की कोशिश कर रहा हूं और फिर एक नई फाइल तैयार करता हूं जो फ़ाइल में प्रत्येक अक्षर को किसी संबंधित मान के साथ प्रतिस्थापित करता है जिसे मैं HashMap से खींचता हूं। मैंने चाबियों और मूल्यों का एक पूरा समूह स्थापित किया, लेकिन बाद में नई फ़ाइल लिखने की प्रक्रिया में मैं यह जांचने की कोशिश करता हूं कि नए String में शामिल होने से पहले मानचित्र में कोई कुंजी है या नहीं। चेक किए गए वर्ण वास्तव में उस फ़ाइल में हैं जो मैं परीक्षण से पढ़ रहा हूं, और फ़ाइल सही ढंग से पढ़ी जाती है। फिर भी यह encryptionDict.containsKey() (मेरी हैशपैप) विधि के साथ विफल रहता है।हैश मैप: क्या है() यह सच नहीं होने पर सही नहीं है?

मुझे आशा है कि कुछ जावा विशेषज्ञ इसे समझने में मेरी सहायता कर सकते हैं! मैं बहुत अनजान हूं, मैं एक सी और डी लड़का से अधिक हूं। मुझे मारने वाला एकमात्र विचार यह था कि यह स्ट्रिंग्स की तरह कुछ होगा जहां "foo" != "foo"। लेकिन वर्ण वस्तुएं नहीं हैं।

कोड नीचे पेस्टबिन में है, देखने के लिए मुख्य भाग वर्ग कन्स्ट्रक्टर, विधि एन्क्रिप्ट और विधि initDictionary है, कोई भी मुझे बता सकता है कि क्यों HashMap<char, String> अमान्य है, ऐसा इसलिए है क्योंकि मुझे इसका उपयोग करना है आपत्ति?

कोड: http://pastebin.com/NcHTHPfw

+0

क्या आपने यह देखने के लिए डीबगर का उपयोग किया था कि यह किस मूल्य में विफल रहा है? – Tudor

+0

हाँ यह कैरेक्टर की तरह दिखता है चलिए मुझे पूरे को छोड़ दें चाराएरे() रूपांतरण – 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. 

यह समस्याग्रस्त बिट है। आप जावा में हैश कुंजी के रूप में सरणी का उपयोग नहीं कर सकते हैं, क्योंकि ऐरे बराबर() और हैशकोड() विधियों को ओवरराइड नहीं करता है।

हैशकोड का उपयोग उस बाल्टी को खोजने के लिए किया जाता है जिसमें आप जिस ऑब्जेक्ट को ढूंढ रहे हैं, और बराबर() विधि वास्तविक ऑब्जेक्ट की तुलना करती है। हैश मैप का उपयोग करने के लिए, आपको इन दोनों तरीकों को एक समझदार तरीके से ओवरराइड करने की आवश्यकता है, जिसे आप सरणी कक्षाओं के रूप में अंतिम नहीं कर सकते हैं। तो एकमात्र चीज जो आप कर सकते हैं यदि आप बिल्कुल चार सरणी का उपयोग करने का आग्रह करते हैं तो एक रैपर वर्ग का उपयोग उस कुंजी के रूप में करना है जिसमें एक चार सरणी है।

कुछ इस तरह:

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

अब आप एक Map<Key, String> है और से एक Key वस्तु bould कर सकते हैं या तो एक String या एक char[]

+2

'स्ट्रिंग' एक चार सरणी के लिए एक अच्छा रैपर वर्ग है :-) –

+0

वैसे मैं चार तरह का उपयोग करना चाहता था क्योंकि स्ट्रिंग पर charAt को कॉल करना आसान है, यह एक है शर्म की बात है कि कोई पत्र नहीं है विधि या कुछ! – BitPuffin

+0

@ फ्रैंकपावेजौ सच है, लेकिन कभी-कभी सुरक्षा कारणों से, स्ट्रिंग पूलिंग इत्यादि के कारण संवेदनशील तरीकों में स्ट्रिंग का उपयोग करना कानूनी नहीं है। –

2

समस्या यह है कि सभी char[] अद्वितीय हैं, उनकी सामग्री की परवाह किए बिना है । ऐसा लगता है कि आप वास्तव में एक स्ट्रिंग का उपयोग करना चाहते हैं। आम तौर पर, यदि आप एक char[]

इसके बजाय का उपयोग किए बिना इस तरह के एक कार्यक्रम में लिख सकते हैं आप लिख सकते हैं

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

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

या शायद 'कैरेक्टर', क्योंकि ऐसा लगता है कि सभी चाबियाँ वास्तव में एकल वर्ण हैं। –

0

कुंजी के रूप में सरणियों का उपयोग न करें, वे तुलनीय नहीं हैं, इसलिए जब यह तुलना मूल्य

से मेल नहीं खाता
0

आप HashMap<char [], String> का उपयोग कर रहे हैं। यह .equals और .hashCode के रूप में काम नहीं करता है, सरणी पर परिभाषित नहीं हैं। यह सरल परीक्षण कार्यक्रम verifiesthis:

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> का उपयोग कर सकते हैं। एक अन्य समाधान एक सरणी स्ट्रिंग [MAX_INDEX] का उपयोग करना होगा जो filecontent.charAt(index) द्वारा अनुक्रमित किया गया है - यह आपके मामले में MAX_INDEX छोटा (जैसे 'z') होने पर भी आसान हो सकता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^