我有一个集合:[1,2,3,4,5,6,7,8,9]我需要从中生成随机数量的唯一元素,例如: 5,3,7,9,下次:4,8。我的函数运行良好,但有时抛出StackOverflowError,因为对生成随机数的函数进行递归调用,并检查是否已经没有重复项。我想知道如何防止这种情况发生。
答案 0 :(得分:1)
一种解决方案是使用迭代(for
或while
循环)而不是递归。
另一种解决方案是首先制作集合的可变副本,每当您从中选择一个元素时,删除该元素,这样就不会有重新选择它的风险。 (但请确保您制作了收藏品的实际副本,例如new ArrayList<Integer>(originalCollection)
,这样您就不会从原始文件中删除元素。)
答案 1 :(得分:1)
你应该在不使用递归的情况下这样做。一个可能更好的算法草图:
那应该做的。
答案 2 :(得分:0)
完整列表中的每个元素在特定元素集合中存在或不存在。这告诉我们使用二进制文件。
0b000000000
映射到[],即所有数字都不存在。
0b111111111
映射到[1,2,3,4,5,6,7,8,9]即所有数字。
两者之间的任何数字(被视为二进制)将映射到整个集合的子集。
0b001010101
映射到[3,5,7,9]
范围中的每个二进制数都将映射到唯一的子集。您的示例意味着订购可能很重要。如果是,那么你将不得不单独处理它。这种方法最多可以提供2 ^ 9 = 512种不同的组合。