2011-04-08 10 views
7

मैं एक कस्टम हैश फ़ंक्शन लागू कर रहा हूं, अगर मुझे हैश मैप बाल्टी में कई टकराव मिलते हैं, तो मुझे कैसे पता चलेगा कि बाल्टी में कितने तत्व संग्रहीत किए जाते हैं?जावा हैशमैप पर टकराव की संख्या पर मीट्रिक कैसे प्राप्त कर सकता हूं?

+0

बिल्कुल नहीं एक नकली लेकिन एक ऐसी ही पो सेंट http://stackoverflow.com/questions/3455457/java-hashmap-detect-collision –

उत्तर

11

एपीआई में इसके लिए कोई सीधा समर्थन नहीं है। सदस्य परिवर्तनीय table, बाल्टी को संग्रहीत करने के लिए उपयोग किया जाता है, यहां तक ​​कि सार्वजनिक भी नहीं है, इसलिए कक्षा को विस्तारित करने से आपको दूर नहीं मिलेगा।

मान लें कि आप हैश फ़ंक्शंस का मूल्यांकन कर रहे हैं और उत्पादन कोड में ऐसा नहीं कर रहे हैं, तो आप प्रतिबिंब का उपयोग करके इन बाधाओं को पारित कर सकते हैं।

मैं बाल्टी की सामग्री मुद्रित करने में कामयाब रहा। वितरण मेट्रिक्स का विश्लेषण करने के लिए इस बिंदु से कठिन नहीं होना चाहिए।

टेस्ट ड्राइवर: कोड यह

import java.lang.reflect.Field; 
import java.util.*; 

class Test { 

    public static void main(String[] args) throws Exception { 

     SubHashMap<String, Integer> map = new SubHashMap<String, Integer>(); 

     map.put("zero", 0); map.put("one", 1); map.put("two", 2); 
     map.put("three", 3); map.put("four", 4); map.put("five", 5); 
     map.put("six", 6); map.put("seven", 7); map.put("eight", 8); 

     map.dumpBuckets(); 
    } 

} 

SubHashMap:

class SubHashMap<K, V> extends HashMap<K, V> { 

    public void dumpBuckets() throws Exception { 

     Field f = HashMap.class.getDeclaredField("table"); 
     f.setAccessible(true); 

     Map.Entry<K, V>[] table = (Map.Entry<K, V>[]) f.get(this); 

     Class<?> hashMapEntryClass = null; 
     for (Class<?> c : HashMap.class.getDeclaredClasses()) 
      if ("java.util.HashMap.Entry".equals(c.getCanonicalName())) 
       hashMapEntryClass = c; 

     Field nextField = hashMapEntryClass.getDeclaredField("next"); 
     nextField.setAccessible(true); 

     for (int i = 0; i < table.length; i++) { 

      System.out.print("Bucket " + i + ": "); 
      Map.Entry<K, V> entry = table[i]; 

      while (entry != null) { 
       System.out.print(entry.getKey() + " "); 
       entry = (Map.Entry<K, V>) nextField.get(entry); 
      } 

      System.out.println(); 
     } 
    } 
} 

आउटपुट:

Bucket 0: 
Bucket 1: two 
Bucket 2: 
Bucket 3: seven five 
Bucket 4: 
Bucket 5: 
Bucket 6: 
Bucket 7: one 
Bucket 8: three 
Bucket 9: 
Bucket 10: 
Bucket 11: four 
Bucket 12: zero 
Bucket 13: 
Bucket 14: eight 
Bucket 15: six 
2

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

+0

प्रतिबिंब का उपयोग कर पहुंच प्रतिबंधों को पार कर सकता है। मेरा जवाब देखें – aioobe

0

आप हैश मैप की आंतरिक बाल्टी तक पहुंच प्राप्त करने के लिए कुछ प्रतिबिंबित कोड लिख सकते हैं और स्वयं का निरीक्षण कर सकते हैं।

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