Java 如何存储超出整数范围的元素数

Java 如何存储超出整数范围的元素数,java,arraylist,Java,Arraylist,我遇到了一个问题,我必须将N个数字的列表存储在一个数组中,然后对其进行排序, 然后我必须在不同的位置加上数字并输出总和。 问题是N的约束,即0啊,我误解了这个问题。所以我们必须存储比int的容量大得多的东西 好吧,我们可以通过分裂和征服这个问题来做到这一点。假设这是理论上的,并且我们有无限的内存,我们可以创建一个SuperArrayList 因为我的泛型不好,没有编译器 public class SuperArrayList<E>() { private ArrayList&

我遇到了一个问题,我必须将N个数字的列表存储在一个数组中,然后对其进行排序,
然后我必须在不同的位置加上数字并输出总和。

问题是N的约束,即0啊,我误解了这个问题。所以我们必须存储比int的容量大得多的东西

好吧,我们可以通过分裂和征服这个问题来做到这一点。假设这是理论上的,并且我们有无限的内存,我们可以创建一个SuperArrayList

因为我的泛型不好,没有编译器

public class SuperArrayList<E>() {
    private ArrayList<ArrayList<E>> myList;
    private int squareRoot;
    private double capacity;
    public SuperArrayList(double capacity) {
        this.capacity = capacity;
        squareRoot = Math.ceil(Math.sqrt(capacity)); //we create a 2d array that stores the capacity
        myList = new ArrayList<ArrayList<E>>(); 
        for(int i = 0; i < squareRoot; i++) {
            myList.add(new ArrayList<E>());
        }
    }

    public E get(double index) {
        if(index >= capacity || index < 0) {
            //throw an error
        }
        else {
            return myList.get((int) capacity / squareRoot).get(capacity % squareRoot);
        }       
    }
}
公共类SuperArrayList(){
私人ArrayList myList;
私有整数平方根;
私人双重能力;
公共SuperArrayList(双容量){
这个。容量=容量;
squareRoot=Math.ceil(Math.sqrt(capacity));//我们创建一个存储容量的2d数组
myList=新的ArrayList();
对于(int i=0;i<平方根;i++){
添加(新的ArrayList());
}
}
公共E-get(双索引){
如果(索引>=容量| |索引<0){
//出错
}
否则{
返回myList.get((int)容量/平方根).get(容量%平方根);
}       
}
}

作为平方根的替代方法,我们可以使用maxValue并添加长度为maxValue的额外数组列表。

您可以使用
LinkedList
,因为它(尽管上面可能会发生奇怪的事情)。如果数字本身可能变大(您似乎没有说明),您还应该能够对数字使用
biginger

//LinkedList可以容纳多个Integer.MAX\u值元素,
List myList=newlinkedlist();
//填上几个数字。
随机r=新随机();
对于(int i=0;i<1000;i++){
add(biginger.probablePrime(10,r));
}
//排序-不确定Collections.Sort是否可以处理>Integer.MAX_值元素,但值得一试。
Collections.sort(myList);
//从0开始。
BigInteger总和=BigInteger.0;
//每隔一个加一个。
布尔加法=假;
for(BigInteger b:myList){
如果(补充){
总和=总和。加上(b);
}
addIt=!addIt;
}
我不确定
Collections.sort
是否能处理这么大的数字列表,更不用说它是否能在宇宙时代成功排序了

你可能更喜欢考虑数据库,但是你甚至可能在这上面有很多数字。

boolean add = true;
for (Double doubleNum : myList) {
    if (add) {   
        tempNo = myStringWayToAdd(tempNo , doubleNum+"");
    }
   add = !add;
}

使用这种方法,您不必使用索引。

get(int)
用于获取arraylist中元素的特定索引<代码>获取(0)获取第一个元素。如文件所述,您可以存储多个Integer.MAX\u值。顺便说一句,要存储20亿个
Double
对象,您至少需要64 GB的内存。祝您在内存中处理超过20亿个对象时好运。@Compass是的,我想在备用索引中获取数字并添加them@user3921830啊哈!我会写出来:3我的问题是,如果我要存储N个元素,其中N超过整数的范围,那么如何获取第I个元素?我认为ArrayList中的ArrayList是不允许的?@user3921830我正在编写一个类来封装它,给我几分钟时间。但是你可以有一个包含arraylistthanx的arraylist,+1他不想要一个包含大值的数组,他想要一个包含值的大数组。@brimborium-这两个都提供了-OP似乎想要存储双精度,并使用一个奇怪的技巧来添加它们,所以这可能就是我们想要的。我在那里做什么?
    // LinkedList can hold more than Integer.MAX_VALUE elements,
    List<BigInteger> myList = new LinkedList<>();
    // Fill it with a few numbers.
    Random r = new Random();
    for (int i = 0; i < 1000; i++) {
        myList.add(BigInteger.probablePrime(10, r));
    }
    // Sort it - not sure if Collections.sort can handle > Integer.MAX_VALUE elements but worth a try.
    Collections.sort(myList);
    // Start at 0.
    BigInteger sum = BigInteger.ZERO;
    // Add  every other one.
    boolean addIt = false;
    for (BigInteger b : myList) {
        if (addIt) {
            sum = sum.add(b);
        }
        addIt = !addIt;
    }
boolean add = true;
for (Double doubleNum : myList) {
    if (add) {   
        tempNo = myStringWayToAdd(tempNo , doubleNum+"");
    }
   add = !add;
}