1
jinyang656 2014-09-02 10:14:33 +08:00 1
不知道你方法体里怎么操作的,java中除了几种基本数据类型之外都是传引用的。
|
2
buptlee OP @jinyang656
程序里面就是对dist_matrix和clusterSet进行一些修改。 传递引用的意思是不是,传递实参的一个副本,因此对实参的修改不会反应到传进去的参数上? 那如果我希望这种修改能保留,应该怎么做?就像c++的传址那样。thanks. |
3
chocotan 2014-09-02 10:42:59 +08:00 1
难道楼主在doSomething里这样了.... dist_matrix=new XXX...
|
4
shuson 2014-09-02 10:46:07 +08:00 1
main() 声明static没用吧。
试试update后return一下? |
5
Aegwynn 2014-09-02 10:55:14 +08:00 1
java根本没有传址的说法,这个是人们从C那边搬过来的概念。
java里面只有传值,不同在于:对基本数据类型,值就是它自身的值;其他是传引用的值。 想要改变对象的值,就不要去改变它的引用即可。 |
6
defaultuser 2014-09-02 10:57:28 +08:00 1
@Aegwynn 说的对
|
7
buptlee OP @chocotan 没有,就是拿出dist_matrix里面的某些键值对做了修改,然后重新插入到dist_matrix里面。
|
9
buptlee OP @Aegwynn 能解释一下,“想要改变对象的值,就不要去改变它的引用即可。”这句话的意思吗,thanks。我的逻辑是这样的:
while(clusterSet.size()>3){ updateDistMatrix(dist_matrix,clusterSet); } 当然,每次循环,updateDistMatrix()函数体里面有减少clusterSet项数的逻辑。 |
10
jamiesun 2014-09-02 11:18:15 +08:00 1
试试不要用函数包裹,直接在循环里顺序执行
doSomething(dist_matrix); doSomething(clusterSet); 八成是方法里改变了引用。 |
11
buptlee OP @jamiesun 好的,我试试不要函数包裹。
能不能解释一下,改变了引用具体是指什么呢,刚刚用java不久,好多概念也是边做边学,见笑啦。 |
12
Aegwynn 2014-09-02 11:23:40 +08:00 1
@buptlee updateDistMatrix这个方法的源代码都贴出来看看,主要是对clusterSet的操作部分。
另外建议public void updateDistMatrix(HashMap<Integer ,LinkedList<Node> > dist_matrix,ArrayList<Integer> nearestNodePair,HashMap<Integer,ArrayList<Integer>> clusterSet) 的方法签名改成 public void updateDistMatrix(Map<Integer ,List<Node> > dist_matrix,List<Integer> nearestNodePair,Map<Integer,List<Integer>> clusterSet) |
13
shuson 2014-09-02 11:34:14 +08:00 1
@buptlee 对,如果要返回两个值,就不值当再封装后返回了。
看了回复们,我也是觉得doSomething函数中可能改变了参数的引用,类似重新创建了新的引用并update的是这个新引用,导致原来传入的参数的引用没有被方法执行操作。 |
14
buptlee OP 已经贴出来啦,方法签名改成map和list之后有啥好处呢,是不是为了多态?效率上能有所提高吗?thanks
|
15
gangsta 2014-09-02 11:37:29 +08:00 2
|