我遇到了一个问题,我必须在数组中存储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
范围的元素数量?
任何帮助将受到高度赞赏。先感谢您。
double
中使用字符串而不是ArrayList
,然后将数字加起来但我的问题是我需要存储N个元素,这些元素可以超出整数范围
答案 0 :(得分:1)
嗯,我们可以通过划分和征服问题来做到这一点。假设这是理论上的,我们有无限的内存,我们可以创建一个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;
}
使用这种方式,您不必使用索引。