我有一个关于使用数字列表构建金字塔的任务,但是其中一个测试出现了问题。在我的任务中,我需要对列表进行排序。我使用Collections.sort():
Collections.sort(inputNumbers, (o1, o2) -> {
if (o1 != null && o2 != null) {
return o1.compareTo(o2);
} else {
throw new CannotBuildPyramidException("Unable to build a pyramid");
}
});
但是这个测试失败了。
@Test(expected = CannotBuildPyramidException.class)
public void buildPyramid8() {
// given
List<Integer> input = Collections.nCopies(Integer.MAX_VALUE - 1, 0);
// run
int[][] pyramid = pyramidBuilder.buildPyramid(input);
// assert (exception)
}
使用OutOfMemoryError替代我自己的CannotBuildPyramidException(在排序后的另一个方法中抛出)。我明白这是由于Collections.sort()方法中的TimSort。我尝试使用HeapSort,但是我甚至无法交换元素,因为我的输入列表是通过Arrays.asList()初始化的,当我使用set()方法时会得到UnsupportedOperationException。然后我尝试将我的列表转换为普通的ArrayList。
ArrayList<Integer> list = new ArrayList<>(inputNumbers);
但我再次遇到了OutOfMemoryError错误。无法编辑测试。 我不知道该如何处理这个问题。 我正在使用Java8和IntelliJIdea SDK。
Error
是一种不好的Java编程实践。当JVM无法继续处理程序执行时,会抛出Error
,根据定义,它无法被正确处理。 - Greg Witczak-XMx=64m
运行 JVM 并将列表大小减小到1000万个元素,或类似的方法。 - Greg Witczak