例如,如果我有
CAT,
在JAVA中,我希望所有可能的字符组合一次更改1个字符(不包括组合CAT):
AAT
BAT
DAT
EAT
.
.
.
ZAT
CBT
CCT
CDT
.
.
.
CZT
CAA
CAB
CAC
.
.
.
CAZ
到目前为止,我已经拥有了:
public class alphaTesting
{
public static void main(String[] args) throws Exception
{
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
for(int i = 0 ; i < alphabet.length ; i++)
{
System.out.println(alphabet[i] + "\n");
}
String word = "cat";
for(int i = 0 ; i < word.length() ; i++)
{
for(int j = 0 ; j < alphabet.length ; j++)
{
// System.out.println(alphabet[i] + "\n");
// System.out.println(charAt(i) = )
word = word.replace(word.charAt(i), alphabet[j]);
System.out.println(word);
}
}
}
}
以下是输出的前几行:
aat
bbt
cct
ddt
eet
fft
ggt
但是在进入word.charAt(1)之前,内循环不是应该先运行所有字母吗?
答案 0 :(得分:1)
如果您喜欢更简洁的代码,则下面的代码应该可以完成。
我在这里使用了一个名为vavr
的功能库。
您可能需要将其添加到依赖项中。
import io.vavr.collection.Stream;
import io.vavr.collection.Traversable;
public class Main {
public static void main(String[] args) {
Stream.ofAll("abcdefghijklmnopqrstuvwxyz".toCharArray())
.map(Character::toUpperCase)
.combinations(3)
.map(Traversable::mkString)
.filter(s -> !s.equals("CAT"))
.take(100)
.forEach(System.out::println);
}
}
take(100)
仅采用前100个值。您可以将其更改为采用任意数量的值,也可以将其删除以获取所有值。
注意:这是JAVA-8
答案 1 :(得分:1)
这有效
字符串word2 =“”;
for(int i = 0 ; i < word.length() ; i++)
{
for(int j = 0 ; j < alphabet.length ; j++)
{
// show indices
System.out.println("i = " + i + " j = " + j);
word2 = word.substring(0,i) + alphabet[j] + word.substring(i+1); ;
if (!word2.equals(word) {
System.out.println(word2);
}
}
}