我想创建一个简单的计算组合。
var chars = new char[]{'a', 'b', 'c', 'd'};
saveVariation(chars, 4);
public static void saveVariation(char characters[], int number_of_characters) {
PrintWriter writer = null;
try {
writer = new PrintWriter(new File("variation.txt"));
} catch (FileNotFoundException e) {
}
var length = characters.length;
switch (number_of_characters) {
case 2 -> {
for (var i = 0; i < length; i += 1) {
for (var j = 0; j < length; j += 1) {
writer.println(String.valueOf(characters[i]) + String.valueOf(characters[j]));
}
}
}
case 3 -> {
for (var i = 0; i < length; i += 1) {
for (var j = 0; j < length; j += 1) {
for (var k = 0; k < length; k += 1) {
writer.println(String.valueOf(characters[i]) + String.valueOf(characters[j]) + String.valueOf(characters[k]));
}
}
}
}
case 4 -> {
for (var i = 0; i < length; i += 1) {
for (var j = 0; j < length; j += 1) {
for (var k = 0; k < length; k += 1) {
for (var l = 0; l < length; l += 1) {
writer.println(String.valueOf(characters[i]) + String.valueOf(characters[j]) + String.valueOf(characters[k]) + String.valueOf(characters[l]));
}
}
}
}
}
}
writer.close();
}
如上所述,嵌套循环可以用递归代替,但有一个主要问题。
如果变量数量太多,即使在增加变量后也会出现内存溢出(更多信息请参见此处),因此我将其保存到文件variation.txt中。
所以我需要修改递归来保存到一个文件中(我不知 prop 体如何操作)。而且,我甚至不知道如何确切地使用该文件。问题中的代码可以工作,但它非常复杂。
请帮
4条答案
按热度按时间mlmc2os51#
打印:
这样做的方式是考虑,从概念上讲,你想要的是相同的阿拉伯数字系统的工作方式。我们如何计数。0,1,2,3,4,.,998,999的序列是什么,而不是你在这里做的?
因此,算法是清楚的:
00000
在数字中,或者在这个系统中,aaaaaa
-每个位置的第一个字符。我们称之为“当前价值”。注意:我使用binarySearch来查找'char'的索引,这只在
chars
排序时有效。如果不是,你必须写一个快速的小'find index'方法,或者(如果chars
非常大,超过500个左右的字符,和没有排序,那么每次查看它都很慢,只有这样才能使用这个替代方法):不是在StringBuilder中构建字符,而是构建一个包含索引而不是值的数组。现在不需要查找chars
数组中数字'B'出现的位置。然后添加到列表中的代码(这里只是list.add(out.toString())
)变得更加复杂,但总体上这在算法上会快一两个数量级。a11xaf1n2#
采用Diego Borba的想法,您可以按如下方式实现它。请注意,以下代码未经测试:
代码为每个字母a、B、c和d向空的开始字符串添加一个字符。然后将下一个a、B、c或d添加到已经创建的字符串a、b、c和d中,依此类推。
如果字符串的当前长度小于预期长度,则继续添加字符。否则它会停止并返回列表。最后一步是将所有创建的String添加到String列表中,并将其作为结果返回。
huwehgph3#
我会使用一个循环来 * 遍历(或 * 模拟 *)内部循环,并使用一个数组来保存这个内部循环的索引:
此代码接收
int
而不是char
的数组(varargs),因此它可以与任何Unicode代码点一起工作,而不仅仅是可以由char
表示的第一个65536。该方法可以像这样调用
应该很容易将
int...
更改为String...
,以用于更复杂的用例。6tr1vspr4#
正如Diego Borba指出的,递归在这里很有用。
使用
getVariation(3, "abc".codePoints().toArray())
调用它,它将返回:正如Basil Bourque所指出的,使用整数码位比使用
char
更好,这就是为什么我用"abc".codePoints().toArray()
来调用它,但如果你喜欢,你也可以用getVariation(4, 'a', 'b', 'c', 'd')
来调用它。如果你想将输出发送到一个文件,使用这个: