2010-12-12 74 views
0

我对java很陌生,只有一门课,并且正在寻找更有效的方法来做事。简单的Java问题:“Subarrays”和“refressing”分配的变量;

A.是否存在子阵列?我想分配给一个新的数组,另一个数组范围内的元素。

我被教导的唯一方法是:

int[] a = {a, b, c, d}; 
int[] b = {a[0], a[1]}; 

有什么类似variable.substring(停止,结束)?

B.这一个很难解释。如果我有两个变量,a和b,其中b = a + 1(例如),并且我更改了a,我必须重新指定b = a + 1,否则b将等于我更改a之前的所有变量。有没有办法使用a的新值“刷新”b,而不必每次都输入b = a + 1(或更复杂的东西)?

这是少功能和质量更多。

回答

3

答:不,没有子阵列。您可以使用System.arraycopy将一个阵列的部分或全部复制到另一个阵列。

除了数组,您可以使用列表,特别是ArrayListList.subList会给你一个“视图”到原始列表的一部分。 (作为一种观点,这意味着如果原始列表被修改,则子列表也将被修改,反之亦然)。

B.否。对于这种情况而不是单独的变量b,最好有一个方法来计算b的值。然后,当你想知道b的值时,你可以调用该方法。如果你想变得很花哨,你甚至可以引入某种缓存,但这是一种优化(如果/当你实际测量性能问题,最好留下)。

+1

+1 - 重新部分B:在建模方面(例如使用UML,MOF,EMF术语),'b'将被描述为“派生属性”。但是你是对的:Java没有提供任何特定的支持,你需要将它作为一种方法来实现。 – 2010-12-13 01:02:02

1

A)做单一操作的唯一方法是使用ArrayList。否则你做的很好。

B)要更新值,您需要执行分配。如果你希望这种情况发生,你可以用Observer/Observable模式来实现,但是你仍然需要实现这一点,它不会比简单的代码行更简单。

1

这一个很难解释。

您似乎寻找的术语是“值语义”和“引用语义”。在Java中,基元(int,char,double等类型的值)具有值语义:变量存储实际值,所以b = a复制该值,并且a += 1增加该值,而不影响任何其他变量恰好保持相同的价值。然而,对象(类是一个类的实例的值)具有引用语义:变量实际上只是“标记”该值(存储某种类型的引用),所以b = a给变量赋予了相同的名称,并且更改了a(你不能在Java中重载操作符,所以我们不能在这种情况下编译a += 1)也会改变b,因为它们实际上是一样的。 (虽然这仍然不会有什么影响,当然,上碰巧是“平等”的任何其他对象 - 不管这实际上意味着该类型)

Java那样提供对象称为IntegerCharDouble等。它们具有引用语义并镜像原始类型。然而,他们是不可变的(即不能改变),所以他们不解决这个“问题”。

此外,这些都不会自动保持两个不同的值彼此“同步”(即通过一些数学函数相关)。如果你想b始终等于a + 1(或者一般来说,比这更复杂的事情),不管a发生了什么,那么你必须自己确定它。有许多方法可以做到这一点,具有不同的复杂性,并且工作的正确工具取决于各种因素。但你应该首先考虑你是否真的想保持b左右。有一个很好的机会,你真正应该做的只是写一个函数b()计算并返回a + 1(或者,再次,无论实际关系是什么)。