我正在實現一個自定義散列函數,如果我碰到一個HashMap存儲桶,我怎麼能知道存儲在存儲桶中有多少元素?如何獲得Java Hashmap上碰撞次數的度量?
7
A
回答
11
在API中沒有直接的支持。用於存儲桶的成員變量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
沒有內在的方法來確定是否發生碰撞。您將不得不調查集合(HashMap)如何將hashCode值分發給存儲桶並自己鏡像該過程,並監視插入以跟蹤衝突。
+0
可以繞過使用反射的訪問限制。看到我的答案。 – aioobe 2011-04-08 22:06:38
0
你可以編寫一些反射代碼來訪問HashMap的內部桶並自己檢查它們。
相關問題
- 1. 球對球碰撞 - 在碰撞時獲得顯着的速度
- 2. Java的HashMap的碰撞檢測
- 3. Java中的HashMap是否安全碰撞
- 4. 如何在碰撞檢測函數中獲得成員變量?
- 5. 獲得碰撞接觸力
- 6. jMonkeyEngine單次碰撞的多次碰撞事件
- 7. Box2D中的高級碰撞檢測 - 碰撞點,力量等
- 8. NSData的長度碰撞
- 9. Java碰撞檢測
- 10. Java OpenGL 3D碰撞
- 11. Box2D獲得碰撞衝動沒有b2ContactListener
- 12. 如何獲得與Box2d的碰撞點或點?
- 13. 如何獲得圓形和三角形的碰撞檢測
- 14. 哈希表碰撞,如何獲得正確的值?
- 15. 如何獲得2個對象的碰撞細節Android
- 16. 碰撞檢測多次。
- 17. 碰撞事件兩次as3
- 18. java中的碰撞檢測
- 19. 的Java傍碰撞檢測
- 20. 2D垂直角度碰撞
- 21. 我如何獲得兩個畫布動畫碰撞?
- 22. 如何在許多玩家之間獲得碰撞檢測
- 23. c#OnTriggerStay與碰撞變量
- 24. AndEngine Box2D。移除碰撞後的碰撞遊戲碰撞
- 25. Java「簡單」撞球/碰撞練習
- 26. 碰撞檢測:碰到哪邊? [Java,Slick2D]
- 27. 如何獲得和HashMap的
- 28. 碰撞檢測和碰撞響應
- 29. Unity 2D碰撞 - 如何設置彼此碰撞的對象
- 30. 碰撞?
不完全重複,但相似的PO st http://stackoverflow.com/questions/3455457/java-hashmap-detect-collision – 2011-04-08 21:35:31