2010-07-30 55 views
0

我有一个大小为N的数组array。对于其中的每3个索引,我想将它们取出并声明并将这些值分配给另一个大小为3的数组。然后,我想返回到该数组并取然后将它放入一个不同大小的数组3.我将像这样迭代3个不同的大小为3的数组a1,a2,a3一旦完成,我想清空a1,a2,a3,并将NEXT 3值添加到大小为3的3个数组重复这个,直到我们到达array.length这样做最有效的方法是什么?

这样做最好/最有效的方法是什么?

+1

是对大小N garuanteed是的倍数3(或9为该问题?) – 2010-07-30 11:10:08

+0

更精确的话题也会更高效 – MRalwasser 2010-07-30 11:26:16

回答

3
for (int i=0; i<=N-9; i+=9) { 
System.arrayCopy(arrayN, i, a1, 0, 3); 
System.arrayCopy(arrayN, i+3, a2, 0, 3); 
System.arrayCopy(arrayN, i+6, a3, 0, 3); 
// presumably do other stuff here 
} 

这是一个非常脆弱但快速的方法。每次以前的值被覆盖,所以不需要清除。如果你确实需要清除arrayN,你可以在循环之后使用Arrays.fill(arrayN, null)

编辑:对于较脆弱的答案,我会假设你会膨胀m x n阵列。而不是硬编码a1,a2,... am,制作一个二维数组a[m][n]

for (i=0; i<=N-m*n; i+=m*n) { 
for (int j=0; j<m; j++) System.arrayCopy(arrayN, i+n*j, a[j], 0, n); 
// presumably do other stuff here 
} 

,正如阿德里安暗示的意见,宣布i外循环和使用价值相对到N的处理剩菜合适。

+0

+1当我评论这个问题时,这正是我想到的。 – 2010-07-30 11:18:41

+0

@Adrian:这应该满足错误的长度问题,前提是正确的回应是不使用barf并尽可能多地使用数组。或者,如果N知道是9的倍数,则循环控制可以修改为'i Carl 2010-07-30 11:22:18

+0

您可以在循环外声明'i',并且如果不是9的倍数,则执行循环后的剩余项目 – 2010-07-30 11:32:17

0
for(int i = 0; i < ##; i++){if(i%3==0){startNewArray}} 
7

作为一般策略,我不会担心起初的效率。

尽可能明确地进行编码,然后编写单元测试加载,确认它是否有效。迭代地提高性能。

它更容易使正确的代码比使快速代码更正更快。

+3

+1对于“更快地制作正确的代码比快速更正代码更容易”。 – 2010-07-30 11:20:05

+0

+1喜欢那个报价! – 2010-07-30 12:07:05

0

它很容易,你可以做到这一点通过以下方式.... 这是下面的代码片段....

的byte [] YourBigArray =新的字节[someValue中];

int temp = 0;

而(温度< YourBigArray.size - 1) { System.arrayCopy(YourBigArray,温度,smallarray,0,3); temp + = 3; }

尝试这种代码,并也参见arrayCopy函数的文档....

享受.....

相关问题