关于Map的例子:
public void A(Map<Integer, String> myMap)
{
myMap = addMap(myMap, yourMap); //yourMap假设已经定义,并且其中有值
}
public static Map<String,Double> addWeight(Map<String,Double> goldMap,Map<String,Double> preMap)
{
Map<String,Double> addMap = new HashMap<String,Double>();
for(String s : preMap.keySet())
{
if(goldMap.containsKey(s))
{
addMap.put(s, (goldMap.get(s) + preMap.get(s)));
} else
{
addMap.put(s, preMap.get(s));
}
}
for(String str : goldMap.keySet())
{
if(!preMap.containsKey(str))
{
addMap.put(str, goldMap.get(str));
}
}
//删除值为空的项
//集合类的都不能在循环的时候删除,因为删除元素后集合发生改变继而不能循环了
//这种删除方式以后不要再用了,严重出错
/*for(String key : cutMap.keySet())
{
Double value = cutMap.get(key);
if(value == 0.0)
{
cutMap.remove(key);
}
}*/
Set mapset = addMap.entrySet();
Iterator iterator = mapset.iterator();
while(iterator.hasNext())
{
Map.Entry mapEntry = (Map.Entry)iterator.next();
Double value =(Double)mapEntry.getValue();
if(value == 0.0)
{
iterator.remove();
}
}
return addMap;
}
方法A的目的是将addMap方法操作后向addMap中填充值,但是结果返回的myMap为空,百思不得其解,询问大牛后才明白,
解释:程序运行时myMap的id=97,进入addWeight方式调试,新创建的addMap的id = 91;
运行完addWeight方法后,A方法的中语句等号左边的myMap的Id = 91, 所以调用A方法的方法B在运行了A方法后myMap为空,因为B方法中的myMap的Id = 97,
总的来说A方法操作的不是传入的myMap了,而是addWeight中的addMap了
第二个问题: 基本类型int作为参数
public void getPredictTrigTypeNum(Segment predictSeg, OutputInfo goldAnswer, String specialTrigType int predictBdTypeNum)
{
for(int x = 0; x < goldAnswer.goldStructure.size(); x++)
{
Segment goldSeg = goldAnswer.goldStructure.get(x);
int goldSegStart = goldSeg.segmentStart;
int goldSegEnd = goldSeg.segmentEnd;
if(predictSeg.goldSegment.equals(goldSeg.goldSegment) && predictSeg.segmentStart == goldSegStart && predictSeg.segmentEnd == goldSegEnd)
{
if(specialTrigType.equals(goldSeg.segmentType))
{
predictBdTypeNum += 1; //边界正确类型正确中 A
break;
}
}
}
}
public void A ()
{
getPredictTrigTypeNum(predictSeg, goldAnswer, specialTrigType,predictBdTypeNum);
}
该方法中 getPredictTrigTypeNum 中的目的是更改参数predictBdTypeNum
方法A调用运行方法getPredictTrigTypeNum后,参数predictBdTypeNum满足条件后会增加1
但是运行后却没有变化,
针对问题1和问题2,传值和传引用能够很好地解释这两个问题