如何在 java 中动态检查条件?

How to check for conditions dynamically in java?

我正在尝试使用 4 个字母 - A、C、T、G 创建所有可能的两个字母单词的列表。所以输出应该像

双字母单词输出

AA
CA
TA
GA
AC
CC
TC
GC
AT
CT
TT
GT
AG
CG
TG
GG

我可以使用此 Java 代码生成上述输出

双字母单词Java代码

import java.io.IOException;

class Variations {

    private static char replace (char bc) {
        switch (bc) {
            case 'A':
                bc = 'C';
                break;

            case 'C':
                bc = 'T';
                break;

            case 'T':
                bc = 'G';
                break;

            case 'G':
                bc = 'A';
                break;
        }

        return bc;
    }

    public static void main(final String[] args) throws IOException {

        String code = "AA";
        char[] bc = new char[code.length()];

        for (int i=0; i<code.length(); i++) {
            bc[i] = code.charAt(i);
        }


        for (int i=0; i < Math.pow(4, bc.length); i++) {

            System.out.println(bc);

            bc[0] = replace(bc[0]);

            if (i%4 == 0) {
                bc[1] = replace(bc[1]);
            }


        }

    }
}

现在我想使用相同的 4 个字母 - A、C、T、G 创建所有可能的三个字母单词的列表。因此输出将类似于

三字母单词输出

AAA
CAA
TAA
GAA
ACA
CCA
TCA
GCA
ATA
CTA
TTA
GTA
AGA
CGA
TGA
GGA
AAC
CAC
TAC
GAC
ACC
CCC
TCC
GCC
ATC
CTC
TTC
GTC
AGC
CGC
TGC
GGC
AAT
CAT
TAT
GAT
ACT
CCT
TCT
GCT
ATT
CTT
TTT
GTT
AGT
CGT
TGT
GGT
AAG
CAG
TAG
GAG
ACG
CCG
TCG
GCG
ATG
CTG
TTG
GTG
AGG
CGG
TGG
GGG

所以要生成上面的输出,我只需要在我的 main 方法中再添加一个 if 语句,

三字母单词Java代码

import java.io.IOException;

class Variations {

    private static char replace (char bc) {
        switch (bc) {
            case 'A':
                bc = 'C';
                break;

            case 'C':
                bc = 'T';
                break;

            case 'T':
                bc = 'G';
                break;

            case 'G':
                bc = 'A';
                break;
        }

        return bc;
    }

    public static void main(final String[] args) throws IOException {

        String code = "AAA";
        char[] bc = new char[code.length()];

        for (int i=0; i<code.length(); i++) {
            bc[i] = code.charAt(i);
        }


        for (int i=0; i < Math.pow(4, bc.length); i++) {

            System.out.println(bc);

            bc[0] = replace(bc[0]);

            if (i%4 == 0) {
                bc[1] = replace(bc[1]);
            }

            if (i%16 == 0) {
                bc[2] = replace(bc[2]);
            }


        }

    }
}

所以我的问题是,如果用户可以选择指定 he/she 是否需要所有 2 个字母的单词或 3 个字母的单词的列表 - 我如何将这两个程序结合起来?两个程序仅在一个条件语句上有所不同。

用户可以指定 he/she 是否需要所有可能的 2 字母单词或 3 字母单词甚至 4 字母单词的列表。我的程序必须动态添加或删除条件语句才能生成列表。是否可以在 Java 中执行此操作?

提前致谢!

您基本上是在实现笛卡尔积。 Google 的 Guava 中有一个非常好的方法叫做 Sets#cartesianProduct.

有了这个你可以轻松生成所有可能的组合:

Set<List<String>> set = Sets.cartesianProduct(Collections.nCopies(3, ImmutableSet.of("A", "C", "T", "G")));

您可以将 3 作为用户确定的参数。

现在我们只需要一些 Java 8 流 "magic":

String output = set.stream()
    .map(list -> list.stream().collect(Collectors.joining()))
    .collect(Collectors.joining("\n"));

你当然可以调整最后一部分,它只是模仿你在问题中显示的输出。

是的。执行此操作的一个好方法是使用某种代码来询问用户他们想要的长度:2 或 3。您可以在控制台中使用扫描仪执行此操作。添加

import java.util.Scanner;

到代码的顶部。然后,在 main 方法的顶部,添加

Scanner scannerName = new Scanner(System.in);

然后您可以询问用户并保存他们的回复。

System.out.print("Enter the length you would like, AA or AAA: ");
String code = scannerName.next();

然后您可以将要添加的 if 语句更改为:

if (i%16 == 0 && code.length() == 3) {your code...}

这样它只会 运行 如果用户输入 AAA 或另一个长度为 3 的令牌。

此外,如果您想将其扩展为最多适用于四个人,您可以像这样折叠代码:

for (int count = 2; count <= code.length(); count++){
   if (i % (Math.pow(2, count)) == 0){
      bc[count] = replace(bc[count]);
   }
}

这应该适用于所有 1、2、3、4 等等。