Java 对数字数组执行算术运算而不进行迭代

Java 对数字数组执行算术运算而不进行迭代,java,arrays,math,Java,Arrays,Math,例如,我想在java中执行以下操作: int[] numbers = {1,2,3,4,5}; int[] result = numbers*2; //result now equals {2,4,6,8,10}; 这是否可以在不遍历数组的情况下实现?我是否需要使用不同的数据类型,例如ArrayList?当前的迭代步骤需要花费一些时间,我希望这样做会有所帮助。不,如果不迭代整个数组,就不能将数组中的每个项相乘。正如注释中所指出的,即使可以使用*操作符,实现仍然必须接触数组中的每个项 此外,不同

例如,我想在java中执行以下操作:

int[] numbers = {1,2,3,4,5};
int[] result = numbers*2;
//result now equals {2,4,6,8,10};

这是否可以在不遍历数组的情况下实现?我是否需要使用不同的数据类型,例如ArrayList?当前的迭代步骤需要花费一些时间,我希望这样做会有所帮助。

不,如果不迭代整个数组,就不能将数组中的每个项相乘。正如注释中所指出的,即使可以使用
*
操作符,实现仍然必须接触数组中的每个项


此外,不同的数据类型也必须做同样的事情。

我认为与显而易见的答案不同可能对其他有相同问题的人有益,他们不介意一层(或两层)的复杂性

在Haskell中,有一种称为“惰性求值”的方法,在这种方法中,您可以将一个无限大的数组乘以2,Haskell会“这样做”。当您访问阵列时,它会根据需要尝试评估所有内容。在Java中,我们没有这样的奢侈,但我们可以以可控的方式模拟这种行为

您需要创建或扩展自己的
列表
类,并添加一些新函数。要支持的每个数学运算都需要函数。我下面有一些例子

LazyList ll = new LazyList();
// Add a couple million objects
ll.multiplyList(2);
这种方法的内部实现是创建一个队列来存储需要执行的所有基本操作,以便保留操作顺序。现在,每次读取元素时,都要在返回结果之前执行队列中的所有操作。这意味着读取速度非常慢(取决于执行的操作数量),但我们至少得到了期望的结果

如果您发现自己每次都遍历整个数组,那么在最后取消队列可能会很有用,而不是保留原始值

如果您发现正在进行随机访问,我将保留原始值,并在调用时返回修改后的结果

如果需要更新条目,则需要确定这意味着什么。您是在此处替换值,还是在执行操作后替换值?根据您的回答,您可能需要在队列中向后运行以获取“pre-operations”值来替换旧值。其原因是,在下次读取同一对象时,将再次应用这些操作,然后将值恢复为您打算在列表中替换的值


此解决方案可能还有其他细微差别,根据您的需要和访问方式(顺序或随机),您实现此解决方案的方式也会完全不同,但这应该是一个良好的开端。

不,不是。如果您的集合非常大,并且您想更快地完成此操作,那么您可以尝试在2个或更多线程中对元素进行操作,但您必须注意同步(使用同步集合)或将集合划分为2个(或更多)集合,并在每个线程中对一个集合进行操作。我不确定它是否会比遍历数组更快——这取决于集合的大小以及您希望对每个元素执行的操作。如果你想使用这个解决方案,你会知道在你的情况下它是否更快-它可能会更慢,而且肯定会更复杂。
一般来说-如果它不是代码的关键部分,并且执行时间也不太长,我会保持现在的状态。

随着Java 8的引入,这项任务可以使用流来完成

 private long tileSize(int[] sizes) {
    return IntStream.of(sizes).reduce(1, (x, y) -> x * y);
}

简短回答:不,你不能。如果可以的话,
*
操作符将被实现来为您运行迭代。怎么可能有比O(n)更快的方法呢?您必须将每个条目相乘……在Haskell中,通过他们奇特的“惰性计算”,这样的事情可能是可能的,但在Java这样的语言中是不可能的。所以迭代数组并将每个元素与2相乘会花费太多时间?你的名单有多长?此外,如果有另一个数据类型,它只会在内部执行迭代和乘法。。。计算需要时间如果有什么问题的话,也许你可以开发你自己的“惰性”计算,对整个数组所做的任何修改只在对象被访问时应用。然后,不管数组的大小如何,所有的数学运算都将是O(1),读取时间更长。当然,这个解决方案有它自己的一套复杂的问题,但是如果你真的遇到java大数组的问题,那就要考虑一下。任何其他语言都会有相同的行为来完成OP ask。@LuiggiMendoza实际上,不,有一些函数式语言具有延迟求值,在其他表达式实际需要时才会创建乘法列表中的每个元素。@Alnitak即使有延迟求值,如果必须在操作后迭代数组,那么每个元素都将被延迟相乘,它不会逃过O(n)时间。是的,这对我的应用程序来说有点过度设计,但肯定可以应用于更复杂的情况。