8

我正在尝试找到一种解决方案/解决方法,用于在不创建新副本的情况下对超大数组进行切片。这是我的问题。

假设我有一个大小为 1 亿或更多的 double/int 数组。我将许多表示不同事物的不同数组存储在一个非常大的数组中,以显着节省内存使用量。因此,我有一个大小为 1 亿的数组,而不是每个大小为 100 的 100 万个数组。我存储索引(开始和停止)以跟踪我的数据。

我想获得数千个大小为 100 的切片。如果我使用 Arrays.copyOfRange() 方法来获得切片,它就违背了将所有内容放在一个大数组中的目的,因为每个切片都是一个占用内存的新副本。

我有遗留代码(许多人多年来编写的超过 100 万行代码)可以处理自己的数据(较小的数组)。无法修改现有代码以使用大型数组中的索引(开始、结束)。

如果我能以某种方式返回原始数组,使得返回的数组是一个引用(或假装是),其中索引 0 是原始大数组中的某个任意索引,那就太好了。

在 C/C++ 中,我可以轻松地返回一个具有特定偏移量和长度的指针,调用代码可以使用该指针。

我在 Java 中有哪些选择?

编辑:我查看了以下类似的问题,但它不包含对我的问题的回复。 如何在不复制数据的情况下在 Java 中获取数组的子数组?

4

4 回答 4

3

For an array of int values, you can wrap in an IntBuffer. You can also wrap a slice of an array.

int[] largeArray = . . .

// create a slice containing the elements 100 through 149 (50 elements):
IntBuffer slice = IntBuffer.wrap(largeArray, 100, 50);
于 2013-03-22T19:38:11.213 回答
2

如何创建一个包含对原始数组和起始索引的引用的包装类,并使用此包装的实例来访问原始数组。

下面的代码在语法上可能不正确,但它应该给你的想法。

public class ArraySlice(){
  private int startIndex;
  private int[] originalArray;
  //getters-setters

  public ArraySlice(int[] originalArray, int startIndex){
    //Initialize
  }

  public int get(int index){
    return originalArray[startIndex+index]
  }
}
于 2015-03-27T08:34:08.230 回答
1

Your best option is to store the indexes of the slices in a separate structure, such as an array storing those indexes.

This way, you do not instantiate large arrays being a partition of the whole data array.

于 2013-03-22T19:37:59.773 回答
1

Can you create your own object that stores index, size and reference to the original array?

class CustomizedArray {
  int startIndex;
  int size;
  int[] originalArray;

  public CustomizedArray(int startIndex, int size, int[] originalArray) {
    this.startIndex = startIndex;
    this.size = size;
    this.originalArray = originalArray;
   }

   public int getIndex(int index) {
     int originalIndex = startIndex+index;
     if(index <0 || originalIndex >= startIndex+size) {
        throw new IndexOutOfBoundException();
     }
     return originalArray[originalIndex];


}

Then you can store CustomizedArray in some bigger structure.

于 2015-03-27T08:31:53.380 回答