-1

我正在尝试构建一个数组,其中每个“块” b 都有一个使 phi(x)=b (euler totient A000010)的每个数字 x 的列表。例如,array[10]=11,22 和 array[4]=5,8,10,12。我通常会做的是构造一个二维数组,但这会抛出一个明显的堆栈溢出异常。你能帮我构建一个更有效的结构吗(堆空间方面)。

4

4 回答 4

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);
于 2013-11-05T21:18:25.243 回答
1

我通常会做的是构造一个 2d 大小的数组,但这会抛出一个明显的堆栈溢出异常。

嗯,是的。你的行有可变数量的元素,所以如果你索引数组没有分配的东西,你会得到一个异常。考虑使用Lists 或Sets 例如:

List<List<Integer>> myOverlyComplexList = ...

然后,您可以为每个元素设置可变编号序列。

于 2013-11-05T21:15:37.007 回答
1

在java中,数组的大小是固定的。如果您要放入的东西超过实际大小,它将产生堆栈溢出(如我们的网站)。我建议您使用 arraylist 而不是 array。arraylist 具有动态大小。

ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>()
于 2013-11-05T21:19:28.337 回答
1

我认为集合数组或列表数组比列表列表更适合您。所以忘记ArrayList<ArrayList<Integer>>andList<List<Integer>>并使用Set<Integer>[]or List<Integer>[]

原因是,一旦你计算了phi(x)is 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!
}
于 2013-11-05T21:23:43.830 回答