我正在實現一個自定義散列函數,如果我碰到一個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. java HashMap碰撞
- 2. 球對球碰撞 - 在碰撞時獲得顯着的速度
- 3. Java的HashMap的碰撞檢測
- 4. Java中的HashMap是否安全碰撞
- 5. java hashMap <Integer,String>碰撞
- 6. Java HashMap碰撞示例不起作用
- 7. 如何在碰撞檢測函數中獲得成員變量?
- 8. 獲得碰撞接觸力
- 9. 統一 - 如何獲得觸發碰撞角度進入?
- 10. Java 2D碰撞?
- 11. 磚碰撞Java
- 12. Box2d力量和碰撞後的速度
- 13. jMonkeyEngine單次碰撞的多次碰撞事件
- 14. 的Java 2D碰撞
- 15. Box2D中的高級碰撞檢測 - 碰撞點,力量等
- 16. NSData的長度碰撞
- 17. 指數退避平均碰撞次數
- 18. Java。碰撞檢測
- 19. Java碰撞檢測
- 20. Java OpenGL 3D碰撞
- 21. 獲得來自Rectangle.Intersects碰撞細節()
- 22. Box2D獲得碰撞衝動沒有b2ContactListener
- 23. Swift SpriteKit:如何讓精靈在碰撞對象時獲得輕微的速度?
- 24. XNA - 球碰撞檢測錯誤的第一次碰撞
- 25. 從jquery碰撞中獲取突變和碰撞數據
- 26. NPM:如何在我的CLI命令中獲得碰撞版本?
- 27. 如何獲得2個對象的碰撞細節Android
- 28. 如何獲得兩個膠囊碰撞的時間
- 29. 如何獲得圓形和三角形的碰撞檢測
- 30. 如何獲得box2d中的碰撞位置
不完全重複,但相似的PO st http://stackoverflow.com/questions/3455457/java-hashmap-detect-collision – 2011-04-08 21:35:31