我写了一个程序的代码来创建字母aaa到zzz的组合。共有17,576种组合。例如,首先是aaa,然后是aab,依此类推。
我想让我的代码计算不同的组合,如1。aaa 2. aab 3. AAC等。
下面是我的代码:
for(char c1 = 'a'; c1 <= 'z'; c1++){
for(char c2 = 'a'; c2 <= 'z'; c2++){
for(char c3 = 'a'; c3 <= 'z'; c3++){
System.out.println("" + c1 + c2 + c3);
}
}
}
谢谢你!
4条答案
按热度按时间wz8daaqr1#
你可以维护一个计数器变量,它在每次执行内部循环时递增:
3qpi33ja2#
这是一种替代实现。
IntStream
个代码点我建议在处理单个字符时,养成使用code points整数的习惯,而不要使用遗留类型
char
。作为一个16位值,char
在物理上无法表示大多数字符。我们可以从
IntStream
生成从a
到z
(97到122)的代码点范围。Character.toString( codePoint )
方法从我们的码位整数生成一个单字符String
对象。characters.toString()= [a、B、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z]
将三个组合字符的每个
String
收集到List
中。然后使用for-each语法对源列表进行三次嵌套循环,对所需输出的每个位置循环一次。
调用
List#size
可以得到你想要的计数。虽然数学上我们知道计数应该是(26 ^ 3)= 17,576。运行时。
17576个组合= [aaa,aab,aac,aad,aae,aaf,…zzw,zzx,zzy,zzz]
使用
Stream#flatMap
进行一行操作我们甚至可以使用Holger的注解中令人印象深刻的代码将代码减少到一行。
关键部分是对
Stream#flatMap
的调用,用于从一个值生成多个值。引用Javadoc:flatMap()操作的作用是对流的元素应用一对多转换,然后将结果元素展平到新的流中。
顺便说一下,
concat
是一个static
方法。考虑到流上的其他fluent风格的方法,这似乎有点奇怪。如果好奇,请参阅this Question。因此,我们首先将代码点流转换为
Strings
流,每个流包含一个字符。对于我们的第一个字符,我们为第二个字符创建了一堆代码点,这些代码点被转换为String
对象。我们为第二个字符中的每一个再次调用flatMap
,每个字符生成另一个代码点流,这些代码点被转换为第三个位置的String
对象。从那里,第一个、第二个和第三个字符组合成一个结果字符串,我们将其收集到最终结果中,即不可修改的List< String >
。我们得到了上面看到的17,576个组合。
多组输入
上面的代码假设我们有一个单一的字符范围来混合和匹配。请注意,我们可以合并多个范围。只需在传递一对流时调用
Stream.concat
。在这个例子中,我们混合并匹配小写字母
ab
沿着大写字母AB
。对于在三个位置中使用的总共四个字符,我们期望4^3 = 64个组合。64种组合。toString()= [aaa,aab,aaA,aaB,阿坝,abb,abA,abB,aAa,aAb,aAA,aAB,aBa,aBb,aBA,aBB,baa,bab,baA,baB,bba,bbb,bbA,bbB,bAa,bAb,bAA,bAB、bBa、bBb、bBA、bBB、Aaa、Aab、AaA、AaB、Aba、Abb、AbA、AbB、AAa、AAb、AAA、AAB、ABa、ABb、ABA、ABB、Baa、Bab、BaA、BaB、Bba、Bbb、BbA、BbB、BAa、BAb、BAA、BAB、BBa、BBb、BBA、BBB]
vtwuwzda3#
有关公式的解释,请阅读以下描述,这将有所帮助
6ju8rftf4#
我曾经有一个项目,我想生成一个“绑定代码”,并将其分配给客户订单中的所有盒子。箱子由拣货员打包,然后放置在传送带上,传送带最终送入单个脊柱,然后前往装运部门,在装运部门,每个承运人将箱子物理绑定在一起(由订单编号和承运人绑定,因为部分订单可能是过夜的,其余订单可能是5天的)。传送带进料经常导致订单的箱子在到达运输部门之前被分离。为了减轻运输员收集相关箱子的任务(按订单/承运人),我想在复杂的运输标签的左上角包含一个大的3个字符的字母值。该值将在视觉上表示订单/承运人组合,使得店员在视觉上(快速且准确地)定位所有相关箱子而不必检查每个箱子的复杂标签来辨别它们的关系。
例如:AAA、AAB、AAC、BAA、ZZZ
因此,生成运输标签的应用程序需要为每个订单/承运商创建此值。每个唯一的组合使控制计数器递增。然后使用该计数器来生成字符值。在达到最大值之后,控制编号被回收,差距足以确保在工作日期间没有重叠。
这是我使用的逻辑。也许,你会发现它的良好价值,为这个问题或其他任何人寻求做类似的。当然,如果需要多于3个字母字符,则可以容易地调整逻辑。
目标:
将控制编号转换为3个字母字符(即AAA至ZZZ)
即26^3 = 17576个组合(注意:确保这是足够的字符,以在再循环之前提供足够的间隙)
数值范围:0至17575(从零开始)
步骤:
换算表:
运行时示例:
17575
0
1
676
971
顺便说一句,我还禁止了顽皮的组合(例如:TIT),利用预设列表来跳过不期望的首字母缩略词。
模数计算器:https://www.calculatorsoup.com/calculators/math/modulo-calculator.php
致上,
保利·D