【问题标题】:How to check for conditions dynamically in java?如何在java中动态检查条件?
【发布时间】:2017-04-16 18:14:35
【问题描述】:

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


        }

    }
}

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

用户可以指定他/她是否需要所有可能的 2 字母词或 3 字母词甚至 4 字母词的列表。我的程序必须动态添加或删除条件语句来生成列表。在 Java 中可以做到这一点吗?

提前谢谢你!

【问题讨论】:

  • 您应该重新设计您的算法以获取一个参数,n 指定序列长度。还要注意Math.pow 产生doubles,这可能导致高于2^53 的舍入错误。
  • 您的问题是您当前的代码正在使用两种“不同的方式”解决 same 问题。

标签: java if-statement conditional


【解决方案1】:

您基本上是在实现笛卡尔积。 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"));

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

【讨论】:

  • 太棒了! . . .
  • 谢谢。!!奇迹般有效。解决了我的头痛:)
  • 我更希望这超出了 OP 的范围。但我想你是对的。我还学到了一些东西(nCopies),因此我很高兴你发布了它。
【解决方案2】:

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

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 等等。

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 2013-06-24
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多