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

时间:2014-09-30 14:10:20

标签: java arraylist

我遇到了一个问题,我必须在数组中存储N个数字的列表,然后对其进行排序,
然后我必须在替代位置添加数字并输出总和 问题是 N的约束,即0 <= N <= 10 11 所以我必须将N声明为 double 类型变量这是我的代码:

ArrayList<Double> myList = new ArrayList<Double>();
myList.add(number);
.....
Collections.sort(myList);
String tempNo = "";
for(double i = 0 ; i < myList.size() ; i=i+2){
tempNo = myStringWayToAdd(tempNo , myList(i)+"");  // Since the sum will exceed the limit of double I have to add the numbers by help of Strings
}

问题get(int)方法需要int而不是double。还有其他方法可以解决问题吗? ,甚至允许存储超过int范围的元素数量?
任何帮助将受到高度赞赏。先感谢您。

<小时/> 修改1: 我可以在double中使用字符串而不是ArrayList,然后将数字加起来但我的问题是我需要存储N个元素,这些元素可以超出整数范围

3 个答案:

答案 0 :(得分:1)

啊,我误解了这个问题。所以我们必须存储一些比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);
        }       
    }
}

作为squareRoot的替代方法,我们可以执行maxValue并添加长度为maxvalue的其他arraylists。

答案 1 :(得分:1)

您可以使用LinkedList,因为它does not have a size limit(虽然奇怪的事情可能会在那里发生)。如果数字本身可能变得很大(你似乎没有声明),你也应该能够使用BigInteger作为你的数字。

    // 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;
    }

我不确定Collections.sort是否可以处理大数字列表,更不用说它是否会在宇宙时代内成功排序。

您可能更愿意考虑使用数据库,但您可能会再次使用这么多数字来处理问题。

答案 2 :(得分:0)

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

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