gpt4 book ai didi

java - 使用 JDI 从哈希表中丢失元素

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:46 25 4
gpt4 key购买 nike

我已经声明并初始化了这些哈希表:

Hashtable<String,Integer> ht = new Hashtable<String,Integer>();
ht.put("due", 2);
ht.put("tre", 3);
ht.put("uno", 1);

Hashtable<String,Integer> ht = new Hashtable<String,Integer>();
ht.put("dodici", 12);
ht.put("tredici",13);
ht.put("nove", 9);
ht.put("dieci", 10);

我想使用 JDI 从哈希表中提取值来比较元素对,我有一个方法,其参数为 ArrayReference s0、s1 ArrayReference、参数parameter1、parameter2 参数:

    if(parameter1.getType().name().equals("java.util.Hashtable")){
System.out.println(" - Hashtable/HashMap - ");

ObjectReference o = (ObjectReference) parameter1.getValue();
ObjectReference o2 = (ObjectReference) parameter2.getValue();

ClassType ct = (ClassType) o.type();

System.out.println("ct "+ ct.allFields());
Value x=o.getValue(ct.fieldByName("table") ); // hashtable.Entry
Value y=o2.getValue(ct.fieldByName("table"));


System.out.println(y.toString());

System.out.println(o.getValue(ct.fieldByName("table")));
Parameter p1 =new Parameter(ct.fieldByName("table").name(),x.type(),x);
Parameter p2 =new Parameter(ct.fieldByName("table").name(),y.type(),y);
if(p1 != null && p2!=null)

distObject = getDistanceCollections(p1,p2);

}
...

else if(s0.getValue(i-1).type().name().equals("java.util.Hashtable$Entry")){

ObjectReference ox = (ObjectReference) s0.getValue(i-1);
ObjectReference oy = (ObjectReference) s1.getValue(j-1);

ClassType ct = (ClassType) ox.type();
ClassType ct2 = (ClassType) oy.type();
System.out.println("ct field Entry: "+ct + ct.allFields());

Value keyx= ox.getValue(ct.fieldByName("key"));
Value valuex= ox.getValue(ct.fieldByName("value"));

Value keyy= oy.getValue(ct2.fieldByName("key"));
Value valuey= oy.getValue(ct2.fieldByName("value"));

if(s0.getValue(i-1).type().name().equals("java.util.Hashtable$Entry")){
Parameter p1 =new Parameter(ct.fieldByName("value").name(),valuex.type(),valuex);
Parameter p2 =new Parameter(ct2.fieldByName("value").name(),valuey.type(),valuey);
if(p1 != null && p2!=null)
match = getDistanceCollections(p1,p2);
}
...

for (int j = 1; j < len1; j++) {
System.out.println( s1.getValue(j-1));
}

for (int i = 1; i < len0; i++)
System.out.println( s0.getValue(i-1));

...

else if(typeName.equals("java.lang.Integer")
||typeName.equals("java.lang.Boolean")
||typeName.equals("java.lang.Double")
||typeName.equals("java.lang.Float")
||typeName.equals("java.lang.Byte")
||typeName.equals("java.lang.Long")
||typeName.equals("java.lang.Short")
||typeName.equals("java.lang.Character")){


Value x=o.getValue(ct.fieldByName("value")); //Integer.value
Value y=o2.getValue(ct2.fieldByName("value"));

System.out.println("Valori: x = "+x+" y ="+y);

distObject = (double) getDistancePrimitive(x.type(), x,y.type(),y);

double matchInternal= distObject;

...

问题是在提取值的过程中我丢失了一个元素。该元素不在内存中。 Java版本:1.8.0_40

输出: /image/hEgsB.gif

有人知道如何解决吗?

最佳答案

Hashtable 对象根据键的哈希值将键值对存储在表中。如果两个不同的键具有相同的哈希值,则第二个值将存储为该哈希值的下一个值。

您可以在此处查看图形示例:hashTable

当您使用 JDI 时,如您的示例所示,您有“java.util.Hashtable”,您必须提取字段表(您是如何做的),然后您将获得“java.util.Hashtable$Entry”类类型。

此类型有 4 个字段java.util.Hashtable$Entry.hash、java.util.Hashtable$Entry.key、java.util.Hashtable$Entry.value、java.util.Hashtable$Entry.next,现在您只处理键和值,并且由于不考虑下一个字段而丢失了一个值。

关于java - 使用 JDI 从哈希表中丢失元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com