java - 按条件将数组划分为子数组的最优雅方法

标签 java arrays

<分区>

我有:非常大的数组:{o1, o2, o3, ..., o100000}。在某些情况下,元素序列具有相同的字段值。我是说 o1.getField()等于 o2.getField()等于 o3.getField() .假设 o1、o2 和 o3 相似

我想要:对每个相似元素子数组(例如 {o1, o2, o3}{o4, o5}、...)进行一些后处理。

重要:由于数组非常大,缓存(意味着将数组移动到另一个集合或复制其中的一部分)是 Not Acceptable !

问题这样做最优雅的方法是什么?

P.S. 我不需要划分整个数组,只需创建一个 postAction。我可以得到第一个{o1, o2, o3} ,制作 postAction,而不是获得第二个,依此类推...

最佳答案

我将从挑战“无法复制数组”的前提开始。如果使用 System.arrayCopy(),数组复制会非常快!

这是我编写的一个小示例程序,它创建、填充和复制一个包含 100,000,000 个元素的数组。

public static void main(final String[] args) {

    final Stopwatch stopwatch = new Stopwatch().start();
    final String[] arr = new String[100_000_000];
    Arrays.fill(arr, "foo");

    final String[] arr2 = new String[arr.length];
    System.arraycopy(arr, 0, arr2, 0, arr.length);
    stopwatch.stop();
    System.out.println(stopwatch.elapsed(MILLISECONDS));

}

在我的普通机器上,这需要 683 毫秒。

  1. 考虑到代码可能会在比我的机器快得多的机器上运行,这是 Not Acceptable 吗?
  2. 或者您的数组是否明显大于 100000000 个元素?

如果这些都不是肯定的,我会选择一些复制解决方案。

关于java - 按条件将数组划分为子数组的最优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742058/

相关文章:

javascript - 交替合并两个不同长度的数组,JavaScript

Java读入字节数组

python - 算法运行时迭代for循环分析

java - @ModelAttribute 注释方法在方法签名中带有@ModelAttribute

java - 读取文件并读取两个数字之间的数字是确定的事情

java - Tornado 从请求 header 读取 X509 证书

c# - 如何正确配置 foreach 循环以避免索引超出范围错误?

Java:使用外部参数对数组进行排序

java - java.lang.ClassNotFoundException:org.apache.hadoop.hive.service.HiveServer $ ThriftHiveProcessorFactory

java - 在运行时在 java(android) 中存储敏感数据