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

时间:2016-12-01 23:00:26

标签: java if-statement conditional

我正在尝试使用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]);
            }


        }

    }
}

所以我的问题是,如果用户可以选择指定他/她是否需要所有双字母单词或3个字母单词的列表 - 我如何组合这两个程序?两个程序仅因一个条件语句而异。

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

提前谢谢!

2 个答案:

答案 0 :(得分:4)

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

通过这种方式,您可以轻松生成所有可能的组合:

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

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

现在我们只需要一些Java 8 Stream“魔术”:

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

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

答案 1 :(得分:1)

是。执行此操作的一种好方法是使用某种代码来询问用户他们想要的长度: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等等。