我有一项关于使用数字列表构建金字塔的任务,但一项测试存在一个问题。在我的任务中,我需要对列表进行排序。我使用 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");
}
});
Run Code Online (Sandbox Code Playgroud)
但是这个测试失败了
@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)
}
Run Code Online (Sandbox Code Playgroud)
使用 OutOfMemoryError 而不是我自己的CannotBuildPyramidException(排序后会在另一个方法中抛出)。我知道这是因为 Collections.sort() 方法中的 TimSort。我尝试使用 HeapSort,但我什至无法交换元素,因为我的输入列表被初始化为 Arrays.asList(),当我使用 set() 方法时,我得到了 UnsupportedOperationException。然后我尝试将我的列表转换为常见的 ArrayList
ArrayList<Integer> list = new ArrayList<>(inputNumbers);
Run Code Online (Sandbox Code Playgroud)
但我又遇到了 OutOfMemoryError。不允许编辑测试。我不知道如何处理这个问题。我使用 Java8 和 IntelliJIdea SDK