【问题标题】:Whats the most efficient way of doing this?这样做最有效的方法是什么?
【发布时间】:2010-07-30 10:52:31
【问题描述】:

我有一个大小为 N 的数组 array。对于其中的每 3 个索引,我想将它们取出并声明并将这些值分配给另一个大小为 3 的数组。然后我想回到那个数组并取下一个 3 并将其放入大小为 3 的不同数组中。我将像这样迭代 3 个大小为 3 的不同数组 a1,a2,a3 完成此操作后,我想清空 a1,a2,a3 并重新添加 NEXT 3 个值到 3 个大小为 3 的数组重复此操作,直到我们到达 array.length

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

【问题讨论】:

  • 尺寸 N 是否保证为 3 的倍数(或 9 的倍数?)
  • 一个更精确的主题也会更有效率

标签: java arrays iteration


【解决方案1】:

作为一般策略,我一开始不会担心效率。

尽可能明确地对其进行编码,然后编写大量单元测试以确认其有效。迭代提高性能。

快速编写正确的代码比快速编写正确的代码更容易。

【讨论】:

  • +1 表示“快速编写正确的代码比快速编写正确的代码更容易。”
【解决方案2】:
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
}

并且,正如 Adrian 在 cmets 中建议的那样,在循环外声明 i 并使用其相对于 N 的值来酌情处理剩余部分。

【讨论】:

  • +1 这是我在评论问题时的想法。
  • @Adrian:这应该满足错误的长度问题,前提是正确的响应是不要呕吐并尽可能多地使用数组。或者,如果 N 是 9 的倍数,则可以将循环控制修改为 i&lt;N
  • 如果不是 9 的倍数,您可以在循环外声明 'i' 并执行循环后舀取剩余项目
【解决方案3】:

这很简单,你可以通过以下方式来做...... 下面是代码sn-p....

byte[] YourBigArray = new byte[SomeValue];

int 温度 = 0;

while(temp

试试这段代码,还可以查看arrayCopy函数的文档......

享受.....

【讨论】:

    【解决方案4】:
    for(int i = 0; i < ##; i++){if(i%3==0){startNewArray}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多