2012-01-02 92 views
0

Hello只与Java有几个小时。 (来自Python) 我想定义一个多维数组并用“add”方法填充它。但是,我看到一些奇怪的结果:将项目添加到多维ArrayList

List<String[]> DrawInstructions = new ArrayList<String[]>(); 
String[] pair = {"",""}; 

pair[0]="UW"; 
pair[1]="100"; 
DrawInstructions.add(pair); 

pair[0]="UM"; 
pair[1]="10"; 
DrawInstructions.add(pair); 

pair[0]="UT"; 
pair[1]="50"; 
DrawInstructions.add(pair) 

我预计DrawInstructions这个落得:

[( “UW,” 100 “),(” UM”, “10”),( “UT”, “50”)

但不是我越来越:

[( “UT”, “50”),( “UT”, “50”),( “UT”,” 50“)]

我相信这是非常基本的,但我无法弄清楚,我已经搜索了几个小时。请你提供任何建议。

+2

您将同一对象添加到列表三次。 'add'函数不克隆该对象。 – DRCB 2012-01-02 13:26:48

+0

http://stackoverflow.com/questions/40480/is-java-pass-by-reference – 2012-01-02 13:34:49

回答

2

您正在添加相同的数组(对)三次。你所做的只是改变它的价值(内容)。请记住,java在引用上运行,而不是在对象的副本上运行。

尝试创建pair1,pair2,pair3。只有一个String[] pair = {"",""};

您编辑同一个对象的3倍,并补充说,到列表中

+0

这解释。谢谢大家的回复。 – 2012-01-02 13:39:31

1

你定义。 你可以这样做:

List<String[]> DrawInstructions = new ArrayList<String[]>(); 

String[] pair1 = {"",""}; 
pair1[0]="UW"; 
pair1[1]="100"; 
DrawInstructions.add(pair1); 

String[] pair2 = {"",""}; 
pair2[0]="UW"; 
pair2[1]="100"; 
DrawInstructions.add(pair2); 
.... 
3

问题是,你改变在同一个阵列一遍又一遍 - .add()不为你创建一个副本。请尝试以下操作:

List<String[]> DrawInstructions = null; 
String[] pair = {"",""}; 

pair[0]="UW"; 
pair[1]="100"; 
DrawInstructions.add(pair); 

pair = new String[] {"",""}; 
pair[0]="UM"; 
pair[1]="10"; 
DrawInstructions.add(pair); 

pair = new String[] {"",""}; 
pair[0]="UT"; 
pair[1]="50"; 
DrawInstructions.add(pair); 

,或者更好的话,

List<String[]> drawInstructions = new ArrayList<String[]>(); 
drawInstructions.add(new String[] {"UW", "100"}); 
drawInstructions.add(new String[] {"UM", "10"}); 
drawInstructions.add(new String[] {"UT", "50"}); 

这将是更接近Java的命名标准,避免NPE上,最大限度地减少本地状态,并且更易读。