我正在尝试构造一个数组,其中每个“块”b都有一个每个数字x的列表,使得phi(x)= b(euler totient A000010)。例如,arrray [10] = 11,22,数组[4] = 5,8,10,12。我通常会做的是构造一个2d数组,但这会抛出明显的堆栈溢出异常。你能帮我构建一个更有效的结构(明智的堆空间)。
答案 0 :(得分:2)
你考虑过一份清单吗?
ArrayList<ArrayList<Integer>> listOflists = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(11);
list.add(12);
listOflists.add(10,list);
答案 1 :(得分:1)
嗯,是的。您的行具有可变数量的元素,因此如果您索引数组尚未分配的内容,您将获得异常。考虑使用我通常会做的是构建一个大小的二维数组,但是 这会引发明显的堆栈溢出异常。
List
或Set
来代替:
List<List<Integer>> myOverlyComplexList = ...
然后你可以为每个元素提供可变数字序列。
答案 2 :(得分:1)
在java中,数组的大小是固定的。 如果你想放入的东西超过实际大小,它将产生堆栈溢出(如我们的网站)。 我建议你使用arraylist而不是array。 arraylist具有动态大小。
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>()
答案 3 :(得分:1)
我认为一组数组或一组数组对你来说比列表更好。所以忘掉ArrayList<ArrayList<Integer>>
和List<List<Integer>>
并使用Set<Integer>[]
或List<Integer>[]
。
原因是,一旦您计算phi(x)
为y
,您就需要分配到数组的条目y
。但如果它是一个列表,则意味着您突然必须将当前list.size()
中的所有条目添加到y
。这只是一段混乱且不必要的代码。
请使用数组,而不是列表;但随意在列表中放置列表或集合。
修改强>
您可以使用类似
的内容对其进行初始化int arraySize = 100;
List<?>[] list = new List<?>[arraySize];
然后,当您发现phi(number) = phiNumber
时,您可能会执行类似
if (phiNumber < arraySize) {
if (list[phiNumber] == null) {
list[phiNumber] = new ArrayList<Integer>();
}
list[phiNumber].add(number);
}
else {
// I don't know. Print an error message? Throw an exception? You choose!
}