7

我想创建一个用户将作为输入的大小的布尔数组。例如 - 用户可能会输入一个大数字,如 1000000000000 ;所以我必须创建一个大小为 1000000000000 的布尔数组。我面临的问题是,我不能将输入存储为 int,因为它不能容纳这么大的数字 - 因此我无法创建数组。Double 是一个选项。我可以将输入数字存储为 double ,但我不知道如何创建 double 数字大小的数组。这就是想法 -

Scanner scanner = new Scanner(System.in);
int target = scanner.nextInt();
boolean [] array_a=new boolean [(target)];

如果目标超出 int 范围,这将不起作用。感谢任何帮助。

更新:谢谢大家。所以你只能创建一个 int 最大范围(即 2147483648)大小的数组,对吧?内存方面并没有早先打击我。打算采取不同的方法。

4

5 回答 5

11

您不能在 Java 中创建大小大于最大正数的数组int,因为数组索引是int. (对于各种List实现也是如此。您可能可以创建一个具有更多条目的条目 [a LinkedList,例如],但是像getand sizestart 之类的东西并不能正常工作,您只能通过iterator[假设事情没有' t 只是简单的休息],这需要一段时间。)

您似乎不太可能真的需要boolean为超过 2,147,483,647 个条目创建一个有空间的数组,但如果您真的这样做,则必须创建多个数组并通过获取索引的模数来选择正确的数组(这将需要成为一个long)。(或者使用一些非 JDK 库,如果存在这样做的话。)这将需要 4G 的 RAM。可行,但完全不同的方法会更好的可能性很高。

但是 1,000,000,000,000 个元素呢?这将需要大约 1-2 TB 的 RAM。正如 NPE 所说,如果你不是在超级计算机上运行,​​你就不会拥有它。

于 2013-03-26T06:50:30.190 回答
8

必须创建一个大小为 1000000000000 的布尔数组。我面临的问题是,我无法将输入存储为 int

你的问题不在于。您的主要问题是您将没有足够的内存来分配具有 1,000,000,000,000 个元素的数据结构(即使您克服了int索引的限制)。

你需要重新考虑算法。

于 2013-03-26T06:50:09.457 回答
1

如何使用 HashMap 并使用长键和布尔值。

你有几个优点。
1.可以使用long范围内的索引
2.不用担心使用的item index的最大尺寸。只要它很长,它就可以工作
3.您不会预先为整个集合分配内存。相反,您只会使用您需要的内存。

于 2013-03-26T06:52:24.787 回答
1

您可以创建一个抽象,例如数组数组(您甚至可以修改它)。

Object [][] 可以是布尔值或其他值。

class LargeArray {

    private final long size;
    private final int sizeI;
    private final int sizeJ;
    private final Object [][] objects;


    public LargeArray() {
        sizeI = 3;//Any reasonable value;
        sizeJ = Integer.MAX_VALUE;
        objects = new Object [sizeI][sizeJ];
        size = sizeI * sizeJ;
    }

    public long size() {
        return size;
    }

    public Object get(long index) {
         int i = index / sizeJ;
         int j = index % sizeJ;
         return objects[i][j];
    }

    public void set(long index, Object object) {
         int i = index / sizeJ;
         int j = index % sizeJ;
         objects[i][j] = object;
    }
}

您还可以更改第一个维度,例如 3。在这种情况下,对象 [3][Integer.MAX_VALUE],您可以创建 (2^31 -1)*3 = 2,147,483,647 * 3 = 6442450941 个元素,您将需要 (2^31 - 1)*3 * 4 =~ 23 GB RAM,这实际上是可能的!!!:)

于 2016-03-25T10:52:28.773 回答
0

首先:您确实需要一个充分的理由来分配这么多内存。正如其他人所说,您可能需要重新考虑这种方法。

一些建议:要么将要分配的数量限制在某个最大值,要么将其存储在文件中并寻找数据或根据需要进行分配(惰性分配)。如果数据稀疏(实际布尔值很少,但索引分布非常广泛),则最好使用地图。如果它主要是零,请考虑只存储零:)

第二:如果打包位,理论上可以分配 8 * 最大数组大小布尔值。请参阅此讨论以获取灵感:Implementing a C style bitfield in Java

于 2013-03-26T06:54:50.407 回答